【问题标题】:How can I use Math.X functions with LINQ?如何在 LINQ 中使用 Math.X 函数?
【发布时间】:2014-02-28 23:18:00
【问题描述】:

我有一个简单的表(SQL 服务器和 EF6)Myvalues,其中包含 IdValue 列(双精度)

我正在尝试获取此表中所有值的自然对数之和。我的 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

【问题讨论】:

    标签: linq entity-framework


    【解决方案1】:

    LINQ 尝试将 Math.Log 转换为 SQL 命令,以便针对 DB 执行它。

    不支持。

    • 第一个解决方案(用于 SQL Server)是使用现有的SqlFunctions 之一。更具体地说,SqlFunctions.Log

    • 另一种解决方案是使用 .ToList() 从数据库中检索所有项目,然后使用 LINQ to Objects(而不是 LINQ to Entities)执行 Math.Log

    【讨论】:

      【解决方案2】:

      由于 EF 无法翻译 Math.Log(),您可以将数据保存在内存中并从您的客户端执行函数:

      var sum = db.Myvalues.ToList().Select(x => Math.Log(x.Value)).Sum();
      

      【讨论】:

        猜你喜欢
        • 2016-11-23
        • 1970-01-01
        • 1970-01-01
        • 2011-08-24
        • 1970-01-01
        • 2020-12-23
        • 1970-01-01
        • 2012-03-09
        • 1970-01-01
        相关资源
        最近更新 更多