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

如何使用NHibernate Linq provider的group by子句获取最新/最后一条记录,nhibernate,linq-to-nhibernate,Nhibernate,Linq To Nhibernate,我在这件事上花了太多时间,我真的希望有人能帮我。 我发现了一个通用的好方法,所以让我们坚持下去 我正在尝试生成此查询,但NHibernate无法生成正确的sql并返回sql查询异常 列vSagsAendring.Id在选择列表中无效,因为它未包含在聚合函数或GROUP BY子句中。它无法执行以下查询: select viewsagsae0_.Id as Id155_, viewsagsae0_.SagId as SagId155_, viewsagsae0_.Journa

我在这件事上花了太多时间,我真的希望有人能帮我。 我发现了一个通用的好方法,所以让我们坚持下去

我正在尝试生成此查询,但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=来自会话中的p.query()
p组:p.SagId
玻璃钢
选择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;
var query=来自会话中的p.query()
p组:p.SagId
玻璃钢
设maxDato=grp.Max(g=>g.Dato)
从p到grp
其中p.Dato==maxDato
选择p;

对于EntityFramework中的LINQ,您的查询似乎是合法的。 我不确定hibernate,您可以尝试使用QueryOverAPI而不是Query


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

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();
var aendring=来自_session.Query()中的sagsAendring
sagsAendring,Dato在哪里==
(
来自_session.Query()中的innersagsAendring
其中innerSagendring.SagId==sagsAendring.SagId
选择innersagsAendring.Dato
).Max()
选择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;
if(Filters.VisInterneAendringer==false)
query=query.Where(x=>x.Ekstern==true);
if(过滤器。Viskunnyesteandringer)
{
query=query.Where(sagsAendring=>sagsAendring.Dato==
(
来自Session.Query()中的innerSagsAendring,其中innerSagsAendring.SagId==sagsAendring.SagId
选择innerSagsAendring.Dato
).Max());
}
返回查询;

您使用的是NH的哪个版本?NHibernate版本3.3.3.4001
 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;