我有一个可以在 LinqPad 中运行的查询,但不能在 NHibernate LINQ 中运行。我在 NHibernate Jira 上发现了类似的错误NHibernate NH-2865 https://nhibernate.jira.com/browse/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)
or g.Sum(t => t.WinAmount == 0 ? 0 : 1)
现在,使用 NHibernate LINQ,如果不更改底层数据库表,我就无法使其正常工作。我的替代方法是添加一个名为 HasWon 的表列,并将其设置为 0(表示 false)和 1(表示 true)。这确实有效,但我觉得除了修改数据库表之外还有更好的方法。也许是使用计算字段的子选择。我的 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,但基于不同的条件。最奇怪的是 NHibernate 转换了我所有的Count(t => t.???)
错误地进入COUNT(*)
在生成的 SQL 中。
LinqPad 生成的 SQL 工作方式如下:
选择总和(
(案件
当 [t1].[WinAmount] > @p3 那么 @p4
其他@p5
结束))AS [值]
希望有更好的方法。