1

次のコードを試していますが、nhibernate は次の例外をスローしています。

式タイプ 'NhSumExpression' は、この SelectClauseVisitor ではサポートされていません。

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 - "式タイプ 'NhSumExpression' は、この 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)
于 2013-08-21T15:07:06.103 に答える