我已经花了太多时间(天),我真的希望有人可以帮助我。 我以通用的方式找到了一个好的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;
答案 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