【问题标题】:Using SQRT in a Linq EF Query在 Linq EF 查询中使用 SQRT
【发布时间】:2014-05-16 01:07:44
【问题描述】:

我需要将 SQRT 函数用作 Linq EF 查询中 where 子句的一部分。我想我可以这样做:

var qry = context.MyTable.Where("sqrt(it.field) > 1");

但它返回错误提示“'sqrt' 无法解析为有效的类型构造函数或函数。靠近函数、方法或类型构造函数,第 6 行,第 5 列。”

我一直认为 linq 从字面上获取 where 子句中的内容并将其转换为直接在 SQL 中执行的语句。好像不是这样的……

有人知道解决方法吗?

谢谢

【问题讨论】:

  • 我认为您需要比较的数字并不总是一,对吧?原因...如果是...请不要使用 sqrt。 Sqrt(1) = 1
  • 重新标记。没有 C#3.5(参见stackoverflow.com/questions/247621/…

标签: sql-server-2008 c#-3.0 linq-to-entities


【解决方案1】:

我不知道您的答案是如何针对 EF 进行的。当我尝试使用 EF4 时,它对我不起作用。我会得到:

LINQ to Entities 无法识别方法 'Double Sqrt(Double)' 方法,并且该方法无法转换为存储表达式。

因此,在我对此进行了一段时间的思考之后(毕竟,Math.Pow(double) 受支持,SQRT 在 SQL 中可用),我意识到一个值的平方根与它的幂是一样的一半。

所以,这个解决方案很好用。

from e in context.MyEntities
     let s = Math.Pow(e.MyDouble, 0.5)
     select s;

生成的SQL使用POWER而不是SQRT

SELECT 
POWER( CAST( [Extent1].[MyDouble] AS float), cast(0.5 as float(53))) AS [C1]
FROM [dbo].[MyEntities] AS [Extent1]

对于一个愚蠢的问题,一个足够简单的解决方法。希望这对其他人有所帮助。

【讨论】:

  • 这是针对 EF 构建的:您可以从我的代码中看到我们使用的是 ObjectQuery,它是一个实体框架概念。但是,由于我的回答来自 2009 年 10 月,而 Entity Framework 4 于 2010 年 4 月发布,我很确定它不是 EF4 解决方案。我很惊讶这样的简单查询会阻碍 EF4。
  • @Godeke。关于日期是真的。但是,是的,这令人惊讶。不过,至少有一个解决方法。
【解决方案2】:

我正在使用 Linq 实体并且能够做到这一点:

        testEntities entities = new testEntities ();

        ObjectQuery<Fees> fees = entities.Fees;

        return from f in fees 
               let s = Math.Sqrt((double)f.FeeAmount)
               where s > 1.0 
               select f ;

当我检查生成的 SQL 时,我得到了

SELECT [t1].[TestTriggerID]
FROM (
    SELECT [t0].[TestTriggerID], SQRT(CONVERT(Float,[t0].[TestTriggerID])) AS [value]
    FROM [TestTrigger2] AS [t0]
    ) AS [t1]
WHERE [t1].[value] > @p0

这似乎是合理的。我无法使用 .Where 字符串格式来重现相同的代码,但我可能遗漏了一些明显的东西。

【讨论】:

  • 我确实尝试了类似的方法,除了我在没有 let 分配的选择部分使用了 Math.Sqrt。是否有些项目可以作为一个让他们在本地不工作的地方工作?
  • LINQ 查询实际上是按照它们构建的顺序运行的。 FROM 定义了源,LET 用一个计算值来扩充它。 WHERE 子句现在有它需要的项目(通过从 FROM+let 构造的子查询)来过滤,最后 SELECT 将值作为结果提供。将计算放在 SELECT 中对于 WHERE 子句在没有明确使用该结果作为子查询的情况下采取行动“为时已晚”。
  • 嗯。当我编写类似于您在此处使用的内容时,我会收到带有 LINQ to Entities does not recognize the method 'Double Sqrt(Double)' method, and this method cannot be translated into a store expression. 的 NotSupportedException。您使用的是 EF4 吗?
  • @Drew Noakes - 我在 EF4 中遇到了同样的问题
  • @Shawn,我下面的回答对你有用吗? stackoverflow.com/questions/1616235/…
【解决方案3】:

检查msdn document.Entity sql 不支持 sqrt 函数。

【讨论】:

    【解决方案4】:

    从 EF6 开始,您可以使用 System.Data.Entity.SqlServer.SqlFunctions.SquareRoot

    【讨论】:

      猜你喜欢
      • 2021-05-03
      • 2019-12-17
      • 1970-01-01
      • 2020-01-25
      • 1970-01-01
      • 2019-03-27
      • 2020-03-29
      • 2021-02-22
      • 2019-07-07
      相关资源
      最近更新 更多