我在SQL2008中有一个诊所表,它有可以为空的十进制纬度和经度列(可以为所有诊所都没有坐标,可以为空)。
我正在使用Linq-to-EF,并希望按给定点的距离计算/排序记录。
为简单起见,我们假设距离计算可以是:
√¯( (ClinicLat - PointLat) ^ 2 + (ClinicLng - PointLng) ^ 2 )
(第一个符号是平方根)
我最接近的是:
Math.Sqrt(
Math.Pow((double)((c.Latitude ?? 0) - latNotNull), 2.0)
+ Math.Pow((double)((c.Longitude ?? 0) - lngNotNull), 2.0)
)
但是这给出了错误:
LINQ to Entities does not recognize the method 'Double Sqrt(Double)' method
我考虑过使用UDF,但EF Code First不允许这样做。我不想使用存储过程,因为我想编写查询&在C#中管理它。我有任何选择吗?
答案 0 :(得分:3)
使用SqlFunctions.SquareRoot
和SqlFunctions.Square
方法:
SqlFunctions.SquareRoot(
SqlFunction.Square(c.Latitude - latNotNull)
+ SqlFunctions.Square(c.Longitude - lngNotNull)
)
它们将被转换为适当的TSQL函数调用。
您根本不需要进行null
检查。
答案 1 :(得分:0)
按距离对记录进行排序
没有平方根的记录顺序相同。