【问题标题】:Sum of top 5 elements in NHibernate LinqNHibernate Linq 中前 5 个元素的总和
【发布时间】:2013-01-05 15:41:03
【问题描述】:

我想接收 linq to NHibernate 查询中前 5 个元素的属性总和。如果我使用下面的代码:

Session.Query<Document>().Take(5).Sum(x => x.Value)

我得到“方法不支持”异常。

有什么想法吗?

NHibernate 3.3.1.4000

【问题讨论】:

    标签: sql linq nhibernate linq-to-nhibernate


    【解决方案1】:

    NHibernate.4.0.2.4000 中,带有 lambda 的 Sum 也适用于 Session.Query&lt;Document&gt;().Take(5).Sum(x =&gt; x.Value)

    如果有可能不返回任何行并且 Value 不是可空类型,则需要将其强制转换为可空类型,因为当不存在任何项目时,总和将返回 null:

    Session.Query<Document>().Take(5).Sum(x => (decimal?)x.Value) ?? 0;
    

    【讨论】:

      【解决方案2】:

      问题在于 提供程序尚未完全实现。尝试使用.ToArray() 实现内存,然后使用 linq-to-memory 计算.Sum()

      例如:

      Session.Query<Document>().Select(x => x.Value).Take(5).ToArray().Sum()
      

      ps:.Skip()DefaultIfEmpty() 可能会出现同样的问题

      【讨论】:

      • 把数据传到服务器再求和会比较低效。如 Daniel Hilgarth 的回答中所述,可以在 DB 中进行求和。
      【解决方案3】:

      你可以用这个:

      Session.Query<Document>().Select(x => x.Value).Take(5).Sum();
      

      NHibernate 仅支持不带表达式参数的 Sum 重载。

      并且由于未知原因,您必须先Select,然后再按您正确评论的Take

      【讨论】:

      • 谢谢,但这也给出了一个例外。
      • Sum 重载是正确的。在您的回答中,您必须更改 Take 和 Select 方法的顺序。
      • @ChrisJ:确实。这很奇怪,应该没什么区别。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-07-15
      • 1970-01-01
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多