首页 > 解决方案 > 我们可以将位置 SQL 转换为 C# LINQ 吗?

问题描述

这是一条返回 30 英里半径内的用户列表的 SQL 语句

SELECT
    id, (
      3959 * acos (
      cos ( radians(78.3232) )
      * cos( radians( lat ) )
      * cos( radians( lng ) - radians(65.3234) )
      + sin ( radians(78.3232) )
      * sin( radians( lat ) )
    )
) AS distance
FROM users
HAVING distance < 30
ORDER BY distance

我正在使用 C# .NET Web API2,是否可以将上述内容转换为 LINQ 语句,以便我们可以让 API 获取这些数据?

标签: c#.netsql-servergeolocationwebapi

解决方案


首先你需要为弧度定义这个方法

    public static double Radians(double angle)
    {
        return (Math.PI / 180) * angle;
    }

现在,您可以使用此查询

        var distances = users
            .Where(x => x.YourFilterOnPagination)
            .ToList() // your collection most be List 
            .Select(x => new
            {
                id = x.id,
                distance = (395 * Math.Acos(Math.Cos(Radians(78.3232)) *
                            Math.Cos(Radians(x.lat)) * Math.Cos(Radians(x.lat) - Radians(65.3234)) +
                            Math.Sin(Radians(78.3232)) *
                            Math.Sin(Radians(x.lat))))
            })
            .Where(d => d.distance < 30)
            .OrderBy(d => d.distance);

YourFilterOnPagination:如果您的数据很大,您可以将其限制在 w


推荐阅读