1

我正在尝试以下代码,但 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();

我一直在环顾四周,找到了这个答案

但是我不确定应该使用什么来代替该示例中使用的 Projections.Constant,以及如何创建由多个字段组成的 group by 子句。

4

1 回答 1

1

看起来您对多列的分组是正确的。

NHibernate 错误跟踪器中报告的此问题类似:NH-2865 -“此 SelectClauseVisitor 不支持表达式类型 'NhSumExpression'。”

问题在于,除了没有帮助的错误消息之外,它本身并不是一个真正的错误。在 NH-2865 中发生的情况是 Sum 表达式包含 NHibernate 不知道如何转换为 SQL 的内容,这导致查询处理的后面部分抛出此异常。

所以问题是,你 sum 表达式包含 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)
于 2013-08-21T15:07:06.103 回答