LinqPad では実行できるが、NHibernate LINQ では実行できないクエリがあります。NHibernate Jira NHibernate NH-2865で同様のバグを見つけましたが、これはおそらく別のバグだと思います。代替案を探しています。
デフォルトの LINQ to SQL を使用して LinqPad で機能するクエリは次のようになります。
from ticket in LotteryTickets
group tiket by ticket.ticketType into g
select new
{
TicketType = g.Key,
TotalWinningTickets = g.Count(b => b.WinAmount != 0),
TotalWon = g.Sum(b => b.WinAmount * b.ticketWeight),
TotalTickets = g.Count(),
}
TotalWinningTickets = g.Sum(t => t.WinAmount > 0 ? 1 : 0)
またはなど、TotalWinningTickets をカウントするさまざまな方法があります。g.Sum(t => t.WinAmount == 0 ? 0 : 1)
現在、NHibernate LINQ では、基礎となる db テーブルを変更せずにこれを機能させることができませんでした。別の方法として、HasWon というテーブル列を追加し、false の場合は 0、true の場合は 1 に設定しました。これは機能しますが、db テーブルを変更する以外にもっと良い方法があると感じています。おそらく、計算フィールドを使用したサブセレクトです。私のNHibernate LINQは次のようになりました:
from ticket in session.Query<Ticket>()
group ticket by ticket.TicketType into g
select new ReportRow
{
TicketType = g.Key,
TotalWinningBets = g.Sum(t => t.HasWon),
TotalTickets = g.Count(),
TotalWon = g.Sum(t => t.WinAmount * t.WagerWeight)
};
私が効果的にやろうとしているのは、NHibernate クエリで複数の Select COUNT を使用することですが、異なる基準に基づいています。最も奇妙なのは、生成された SQLで NHibernate がすべての myCount(t => t.???)
を間違って変換することです。COUNT(*)
LinqPad は次のように機能する SQL を生成します: SELECT SUM( (CASE WHEN [t1].[WinAmount] > @p3 THEN @p4 ELSE @p5 END)) AS [値]
より良い方法があることを願っています。