【问题标题】:Linq-to-EF with nullable decimals & math functions具有可为空小数和数学函数的 Linq-to-EF
【发布时间】:2014-01-07 20:20:43
【问题描述】:

我在 SQL2008 中有一个 Clinics 表,其中包含可以为空的十进制纬度和经度列(可以为空,因为我没有所有诊所的坐标)。

我正在使用 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# 中编写查询和管理它。我有什么选择吗?

【问题讨论】:

  • 我很困惑。是 linq 到 SQL 还是 EF?
  • @MarcinJuraszek 这是 EF,他说他正在使用 Code First。
  • 将问题更新为 Linq-to-Entities。对不起,这个 Linq 的东西有点新。出于兴趣,它会有什么不同?

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


【解决方案1】:

使用SqlFunctions.SquareRootSqlFunctions.Square 方法:

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

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

您甚至根本不需要检查null

【讨论】:

  • 看起来正是我所需要的。感谢磨坊。
  • Linq-to-SQL 会有什么不同吗?
  • 是的,如 MSDN 所述:此函数只能出现在 LINQ to Entities 查询中
  • 如果你不介意的话,你会如何为 Linq-to-SQL 做呢?
  • @Sean For LinqToSql msdn.microsoft.com/en-us/library/bb882648(v=vs.110).aspx 由于 Math.Sqrt 不在不支持列表中,因此支持。使用 Math.Sqrt
【解决方案2】:

按距离对记录进行排序

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

【讨论】:

  • 呃...应该是评论吗?
  • 不,这是一个选项。所以这是一个答案。
  • 问题是询问如何在 Linq-to-EF 查询中进行数学运算,我看不出这是如何回答问题的。这是一个非常好的评论;)
  • 谢谢,我已经这样做了,但对数学很感兴趣,因为最终我将不得不使用更复杂的“真实”公式......
猜你喜欢
  • 2023-02-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多