我有一个简单的表(SQL服务器和EF6) Myvalues ,列 Id & 值(双倍)
我正在尝试获取此表中所有值的自然对数的总和。我的LINQ声明是:
var sum = db.Myvalues.Select(x => Math.Log(x.Value)).Sum();
它编译得很好,但我得到一个RTE:
LINQ to Entities无法识别方法'Double Log(Double)'方法,并且此方法无法转换为商店表达式。
我做错了什么/我该如何解决这个问题?
FWIW,我可以直接对数据库执行以下SQL查询,这给了我正确的答案:
select exp(sum(LogCol)) from
(select log(Myvalues.Value) as LogCol From Myvalues
) results
答案 0 :(得分:5)
LINQ尝试将Math.Log
转换为SQL命令,以便对数据库执行。
不支持此功能。
第一个解决方案(对于SQL Server)是使用现有的SqlFunctions
之一。更具体地说,SqlFunctions.Log
。
另一种解决方案是使用.ToList()
从数据库中检索所有项目,并使用LINQ to Objects(而不是LINQ to Entities)执行Math.Log
。
答案 1 :(得分:2)
由于EF无法翻译Math.Log()
,您可以将数据存入内存并从客户端执行此功能:
var sum = db.Myvalues.ToList().Select(x => Math.Log(x.Value)).Sum();