我需要将SQRT函数用作Linq EF查询中where子句的一部分。我想我可以这样做:
var qry = context.MyTable.Where("sqrt(it.field) > 1");
但它返回一个错误,说“'sqrt'无法解析为有效的类型构造函数或函数。,靠近函数,方法或类型构造函数,第6行,第5列。”
我一直认为linq从字面上理解where子句中的内容并将其转换为直接在SQL中执行的语句。情况似乎并非如此......
任何人都知道解决方法吗?
由于
答案 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
。