此SelectClauseVisitor不支持表达式类型'NhSumExpression'

时间:2013-02-22 02:04:40

标签: nhibernate linq-to-nhibernate

我有一个查询,我可以在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 [值]

希望有更好的方法。

0 个答案:

没有答案