如何在LINQ中使用Math.X函数?

时间:2014-02-28 14:19:56

标签: linq entity-framework

我有一个简单的表(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

2 个答案:

答案 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();