Nhibernate查询条件总和

时间:2013-08-21 08:43:02

标签: nhibernate group-by sum multiple-columns conditional-statements

我正在尝试以下代码,但是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子句。

1 个答案:

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