如何使用NHibernate Linq提供程序的group by子句获取最新/最后一条记录

时间:2013-12-03 09:43:27

标签: nhibernate linq-to-nhibernate

我已经花了太多时间(天),我真的希望有人可以帮助我。 我以通用的方式找到了一个好的article on describing my problem所以让我们坚持下去。

我正在尝试构建此查询,但NHibernate无法构建正确的sql并返回sql查询异常。

vSagsAendring.Id在选择列表中无效,因为它不包含在聚合函数或GROUP BY子句中。它无法执行以下查询:

select
    viewsagsae0_.Id as Id155_,
    viewsagsae0_.SagId as SagId155_,
    viewsagsae0_.JournalNr as JournalNr155_,
    viewsagsae0_.LbfNr as LbfNr155_,
    viewsagsae0_.OrgNr as OrgNr155_,
    viewsagsae0_.OrgNavn as OrgNavn155_,
    viewsagsae0_.AfdNavn as AfdNavn155_,
    viewsagsae0_.SagsType as SagsType155_,
    viewsagsae0_.Status as Status155_,
    viewsagsae0_.SagsbehandlerInit as Sagsbeh10_155_,
    viewsagsae0_.Dato as Dato155_,
    viewsagsae0_.JournalAktionType as Journal12_155_,
    viewsagsae0_.Beskrivelse as Beskriv13_155_,
    viewsagsae0_.Ekstern as Ekstern155_
from vSagsAendring viewsagsae0_
group by viewsagsae0_.SagId
var query = from p in _session.Query<ViewSagsAendring>()
            group p by p.SagId
            into grp
            select grp.OrderByDescending(g => g.Dato).First();

这是另一个版本也来自文章:

var query = from p in _session.Query<ViewSagsAendring>()
                    group p by p.SagId
                    into grp
                    let maxDato = grp.Max(g => g.Dato)
                    from p in grp
                    where p.Dato == maxDato
                    select p;

2 个答案:

答案 0 :(得分:2)

这是一段漫长的旅程,但现在已经结束了。我希望通过回答我自己的问题,我可以在同样的情况下帮助其他人。

var aendring = from sagsAendring in _session.Query<ViewSagsAendring>()
                       where sagsAendring.Dato ==
                       (
                          from innersagsAendring in _session.Query<ViewSagsAendring>()
                          where innersagsAendring.SagId == sagsAendring.SagId
                          select innersagsAendring.Dato
                       ).Max()
                       select sagsAendring;
var result = aendring.ToList();

因为你可以链接linq语句,你可以像这样建立一个linq过滤器

 if(Filters.VisInterneAendringer == false)
            query = query.Where(x => x.Ekstern == true);
 if (Filters.VisKunNyesteAendringer)
        {
            query = query.Where(sagsAendring => sagsAendring.Dato ==
                               (
                                   from innerSagsAendring in Session.Query<ViewSagsAendring>()                                                        where innerSagsAendring.SagId == sagsAendring.SagId
                                   select innerSagsAendring.Dato
                                ).Max());
        }

 return query;

答案 1 :(得分:1)

您的查询对于EntityFramework中的LINQ来说似乎是合法的。 我不确定hibernate,你可能会尝试使用QueryOver API而不是Query

http://nhibernate.info/blog/2009/12/17/queryover-in-nh-3-0.html