在一个LINQ查询EF使用SQRT(Using SQRT in a Linq EF Query)

2019-08-31 20:57发布

我需要使用SQRT函数作为一个LINQ查询EF where子句的一部分。 我想我可以做到这一点:

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

但它返回一个错误说“‘开方’不能被解析成一个有效的类型构造函数或函数,近函数,方法或类构造函数,第6行,第5列。”

我一直认为LINQ字面上采取什么where子句中和转化到这是直接在SQL语句的执行。 这似乎并没有这样的情况?

任何人都知道变通?

谢谢

Answer 1:

我使用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

这似乎是合理的。 我无法使用。凡字符串格式再现相同的代码,但我可能失去了一些东西明显。



Answer 2:

我不知道你是如何得到你的答案对EF工作。 当我和EF4试了一下,它不会为我工作。 我会得到:

LINQ到实体无法识别方法“双SQRT(双)”的方法,并且这种方法不能被翻译成表达商店。

所以敲我的头这一段时间后(毕竟, 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]

一个很简单的解决方法,以一个愚蠢的问题。 希望这可以帮助别人了。



Answer 3:

检查MSDN文档 .Entity SQL不支持sqrt函数。



Answer 4:

您可以使用System.Data.Entity.SqlServer.SqlFunctions.SquareRoot作为EF6的。



文章来源: Using SQRT in a Linq EF Query