具有可空小数的Linq-to-EF&数学函数

时间:2014-01-07 20:20:43

标签: .net sql-server linq entity-framework linq-to-entities

我在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#中管理它。我有任何选择吗?

2 个答案:

答案 0 :(得分:3)

使用SqlFunctions.SquareRootSqlFunctions.Square方法:

SqlFunctions.SquareRoot(
        SqlFunction.Square(c.Latitude - latNotNull)
        + SqlFunctions.Square(c.Longitude - lngNotNull)
    )

它们将被转换为适当的TSQL函数调用。

您根本不需要进行null检查。

答案 1 :(得分:0)

  

按距离对记录进行排序

没有平方根的记录顺序相同。