我有一个查询,我可以在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,例如TotalWinningTickets = g.Sum(t => t.WinAmount > 0 ? 1 : 0)
或g.Sum(t => t.WinAmount == 0 ? 0 : 1)
现在,使用NHibernate LINQ,我无法在不更改基础数据库表的情况下实现此功能。我的另一种方法是添加一个名为HasWon的表列,我将其设置为0表示false,1表示true表示。这确实有效,但我觉得除了修改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查询中多次选择COUNT,但是基于不同的标准。最奇怪的是,NHibernate在生成的SQL中将我的Count(t => t.???)
错误地转换为COUNT(*)
。
LinqPad生成以这种方式工作的SQL: SELECT SUM( (案件 什么时候[t1]。[WinAmount]&gt; @ p3那么@ p4 ELSE @ p5 结束))AS [值]
希望有更好的方法。