2

我正在尝试查找所有具有 lat lon 且位于我所在位置的特定英里范围内的 db 条目。

我的答案基于这个 stackoverflow 答案:

MySQL 大圆距离(Haversine 公式)

这是我所拥有的:

                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
                                            );

我收到以下错误:

"errorCode": "NotSupportedException",
    "message": "LINQ to Entities does not recognize the method 'Double Acos(Double)' method, and this method cannot be translated into a store expression.",
    "stackTrace": "[GetByLatLonRequest: 6/24/2013 6:57:14 PM]:\n[REQUEST: {lat:3,lon:3,maxDistance:10,measureSystem:N}]\nSystem.NotSupportedException: LINQ to Entities does not recognize the method 'Double Acos(Double)' method, and this method cannot be translated into a store expression.\r\n   at System.Data.Objects.ELinq.ExpressionConverter.MethodCallTranslator.DefaultTranslator.Translate(ExpressionConverter parent,
4

2 回答 2

1

这意味着 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
                                            );

这将在运行数学函数之前枚举结果。

您最好的选择是构建谓词:http ://www.albahari.com/nutshell/predicatebuilder.aspx

于 2013-06-24T19:22:46.117 回答
1

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

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

http://dev.mysql.com/doc/refman/5.0/en/mysql-spatial-datatypes.html

于 2013-06-24T20:30:00.603 回答