servicestack,C#,Mysql,servicestack" /> servicestack,C#,Mysql,servicestack" />

C# MySQL C查找某个最大距离内的Lat-Lon条目

C# MySQL C查找某个最大距离内的Lat-Lon条目,c#,mysql,servicestack,C#,Mysql,servicestack,我正试图找到所有数据库条目,这些条目的纬度在我所在位置的某一英里范围内 我的回答基于以下回答: 以下是我所拥有的: IQueryable<myTable> busLst = (from b in db.myTable where (3959 * Math.Acos(Math.Cos(radians(latLonRequest.lat)) * Math.Cos(ra

我正试图找到所有数据库条目,这些条目的纬度在我所在位置的某一英里范围内

我的回答基于以下回答:

以下是我所拥有的:

                IQueryable<myTable> busLst = (from b in db.myTable
                                             where (3959 * Math.Acos(Math.Cos(radians(latLonRequest.lat)) * Math.Cos(radians(b.lat))
                                            * Math.Cos(radians(b.lon) - radians(latLonRequest.lon)) + Math.Sin(radians(latLonRequest.lat)) *
                                            Math.Sin(radians(b.lat)))) < latLonRequest.MaxDistance
                                             select b
                                            );

这意味着linq不知道如何将函数转换为SQL。您需要做的是首先提取数据,然后在此基础上运行逻辑:

IQueryable<myTable> busLst = (from b in db.myTable.AsEnumerable()
                                             where (3959 * Math.Acos(Math.Cos(radians(latLonRequest.lat)) * Math.Cos(radians(b.lat))
                                            * Math.Cos(radians(b.lon) - radians(latLonRequest.lon)) + Math.Sin(radians(latLonRequest.lat)) *
                                            Math.Sin(radians(b.lat)))) < latLonRequest.MaxDistance
                                             select b
                                            );
这将在运行数学函数之前枚举结果


更好的选择是构建谓词:

编辑:不知何故,我认为OP在谈论TSQL,但没有这样的话题

这个函数似乎可以在MySQL中定义,为什么不创建一个SQL函数或存储过程并从那里开始呢?顺便说一句,根据位置的数量,您可能需要调查地理/空间数据类型,因为它们有更好的索引


你能告诉我使用谓词相对于我目前的方法的优势吗?它允许你构建多个谓词,例如Where子句,并将它们分离成函数。它使您的代码更干净,您还可以对它们执行类似或的操作。我认为在你的例子中没有必要,但知道它的存在是件好事。
IQueryable<myTable> busLst = (from b in db.myTable.AsEnumerable()
                                             where (3959 * Math.Acos(Math.Cos(radians(latLonRequest.lat)) * Math.Cos(radians(b.lat))
                                            * Math.Cos(radians(b.lon) - radians(latLonRequest.lon)) + Math.Sin(radians(latLonRequest.lat)) *
                                            Math.Sin(radians(b.lat)))) < latLonRequest.MaxDistance
                                             select b
                                            );