【发布时间】: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
我想接收 linq to NHibernate 查询中前 5 个元素的属性总和。如果我使用下面的代码:
Session.Query<Document>().Take(5).Sum(x => x.Value)
我得到“方法不支持”异常。
有什么想法吗?
NHibernate 3.3.1.4000
【问题讨论】:
标签: sql linq nhibernate linq-to-nhibernate
在 NHibernate.4.0.2.4000 中,带有 lambda 的 Sum 也适用于 Session.Query<Document>().Take(5).Sum(x => x.Value)。
如果有可能不返回任何行并且 Value 不是可空类型,则需要将其强制转换为可空类型,因为当不存在任何项目时,总和将返回 null:
Session.Query<Document>().Take(5).Sum(x => (decimal?)x.Value) ?? 0;
【讨论】:
问题在于 nhibernate linq 提供程序尚未完全实现。尝试使用.ToArray() 实现内存,然后使用 linq-to-memory 计算.Sum()。
例如:
Session.Query<Document>().Select(x => x.Value).Take(5).ToArray().Sum()
ps:.Skip() 和 DefaultIfEmpty() 可能会出现同样的问题
【讨论】:
你可以用这个:
Session.Query<Document>().Select(x => x.Value).Take(5).Sum();
NHibernate 仅支持不带表达式参数的 Sum 重载。
并且由于未知原因,您必须先Select,然后再按您正确评论的Take。
【讨论】: