3

我有一个可以在 LinqPad 中运行的查询,但不能在 NHibernate LINQ 中运行。我在 NHibernate Jira NHibernate NH-2865上发现了一个类似的错误,但我认为这可能是一个不同的错误,我正在寻找可能的替代方案。

在 LinqPad 中使用默认 LINQ to SQL 的查询如下所示:

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 表示假,1 表示真。这确实有效,但我觉得除了修改数据库表之外还有更好的方法。也许是使用计算字段的子选择。我的 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在生成的 SQL中将所有我Count(t => t.???)错误地转换为。COUNT(*)

LinqPad 生成以这种方式工作的 SQL: SELECT SUM( (CASE WHEN [t1].[WinAmount] > @p3 THEN @p4 ELSE @p5 END)) AS [value]

希望有更好的方法。

4

0 回答 0