我正在尝试以下代码,但是nhibernate会抛出以下异常:
此SelectClauseVisitor不支持表达式类型'NhSumExpression'。
var data =
(
from a in session.Query<Activity>()
where a.Date.Date >= dateFrom.Date && a.Date.Date <= dateTo.Date
group a by new { Date = a.Date.Date, UserId = a.RegisteredUser.ExternalId } into grp
select new ActivityData()
{
UserID = grp.Key.UserId,
Date = grp.Key.Date,
Bet = grp.Sum(a => a.Amount < 0 ? (a.Amount * -1) : 0),
Won = grp.Sum(a => a.Amount > 0 ? (a.Amount) : 0)
}
).ToArray();
我一直在四处寻找this answer
但是我不确定应该使用什么代替在这个例子中使用的Projections.Constant,以及我应该如何创建一个由多个字段组成的group by子句。
答案 0 :(得分:1)
看起来您对多列的分组是正确的。
NHibernate错误跟踪器中报告的此问题类似于:NH-2865 - "Expression type 'NhSumExpression' is not supported by this SelectClauseVisitor."
问题在于,除了不太有用的错误消息之外,它并不是真正的错误。 NH-2865中发生的事情是Sum表达式包含NHibernate不知道如何转换为SQL的内容,这导致查询处理的后续部分抛出此异常。
所以问题是,你总结表达式包含NHibernate无法转换的内容?跳到脑海的是使用三元运算符。我相信NHibernate LINQ提供程序支持三元运算符,但是这个特定组合中可能存在一些问题。
但是,我认为你的表达式可以这样写成:
Bet = grp.Sum(a => Math.Min(a.Amount, 0) * -1), // Or Math.Abs() instead of multiplication.
Won = grp.Sum(a => Math.Max(a.Amount, 0))
如果这不起作用,请尝试使用真正的简单表达式,如下所示。如果可行,我们至少知道分组本身按预期工作。
Won = grp.Sum(a => a.Amount)