在Linq EF查询中使用SQRT

时间:2009-10-23 22:21:57

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

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

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

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

我一直认为linq从字面上理解where子句中的内容并将其转换为直接在SQL中执行的语句。情况似乎并非如此......

任何人都知道解决方法吗?

由于

4 个答案:

答案 0 :(得分:8)

我不知道你是如何得到你的答案对抗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]

针对愚蠢问题的简单解决方法。希望这有助于其他人。

答案 1 :(得分:2)

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

        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字符串格式来重现相同的代码,但我可能遗漏了一些明显的东西。

答案 2 :(得分:1)

检查msdn document。实体sql不支持sqrt功能。

答案 3 :(得分:0)

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