我需要使用SQRT函数作为一个LINQ查询EF where子句的一部分。 我想我可以做到这一点:
var qry = context.MyTable.Where("sqrt(it.field) > 1");
但它返回一个错误说“‘开方’不能被解析成一个有效的类型构造函数或函数,近函数,方法或类构造函数,第6行,第5列。”
我一直认为LINQ字面上采取什么where子句中和转化到这是直接在SQL语句的执行。 这似乎并没有这样的情况?
任何人都知道变通?
谢谢
我需要使用SQRT函数作为一个LINQ查询EF where子句的一部分。 我想我可以做到这一点:
var qry = context.MyTable.Where("sqrt(it.field) > 1");
但它返回一个错误说“‘开方’不能被解析成一个有效的类型构造函数或函数,近函数,方法或类构造函数,第6行,第5列。”
我一直认为LINQ字面上采取什么where子句中和转化到这是直接在SQL语句的执行。 这似乎并没有这样的情况?
任何人都知道变通?
谢谢
我使用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
这似乎是合理的。 我无法使用。凡字符串格式再现相同的代码,但我可能失去了一些东西明显。
我不知道你是如何得到你的答案对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]
一个很简单的解决方法,以一个愚蠢的问题。 希望这可以帮助别人了。
检查MSDN文档 .Entity SQL不支持sqrt函数。
您可以使用System.Data.Entity.SqlServer.SqlFunctions.SquareRoot
作为EF6的。