Orchard中的NHibernate JoinQueryOver查询
我有一个果园网站。有两个关联实体:代理机构(AgencyPartRecord)和设施(FacilityPartRecord),它们与AgencyFacilitiePartRecord以n对n的方式连接。以下是相应的记录:Orchard中的NHibernate JoinQueryOver查询,nhibernate,orchardcms,Nhibernate,Orchardcms,我有一个果园网站。有两个关联实体:代理机构(AgencyPartRecord)和设施(FacilityPartRecord),它们与AgencyFacilitiePartRecord以n对n的方式连接。以下是相应的记录: public class AgencyPartRecord : ContentPartRecord { ... public virtual IList<AgencyFacilitiesPartRecord> AgencyFacilitiesP
public class AgencyPartRecord : ContentPartRecord
{
...
public virtual IList<AgencyFacilitiesPartRecord> AgencyFacilitiesPartRecords { get; set; }
...
}
public class AgencyFacilitiesPartRecord
{
public virtual int Id { get; set; }
public virtual AgencyPartRecord AgencyPartRecord { get; set; }
public virtual FacilityPartRecord FacilityPartRecord { get; set; }
}
public class FacilityPartRecord : ContentPartRecord
{
public virtual string Name { get; set; }
public virtual string Description { get; set; }
}
问题是此查询在SQL中不生成GROUP BY子句:
SELECT ...
FROM AgencyPartRecord this_
WHERE ...
and this_.Id in
(
SELECT this_0_.AgencyPartRecord_id as y0_
FROM AgencyFacilitiesPartRecord this_0_
WHERE this_0_.FacilityPartRecord_id in (@p2, @p3)
HAVING count(this_0_.FacilityPartRecord_id) = @p4
)
我做错了什么
谢谢 我终于明白了!:)
正确的代码是:
AgencyFacilitiesPartRecord facility = null;
var fsub = QueryOver.Of<AgencyFacilitiesPartRecord>(() => facility)
.WhereRestrictionOn(r => r.FacilityPartRecord.Id).IsIn(filter.Facilities)
.SelectList(list => list
.SelectGroup(r => r.AgencyPartRecord.Id)
)
.Where(Restrictions.Eq(
Projections.Count(Projections.Property(() => facility.FacilityPartRecord.Id)), filter.Facilities.Count));
agencies = agencies.WithSubquery.WhereProperty(a => a.Id).In(fsub);
AgencyFacilitiesPartRecord facility=null;
var fsub=查询版本) 两件事——你把LINQ和QueryOver混在一起,这是你无法做到的。还有,您试图生成的SQL是什么?从这里开始通常是最有帮助的。@Andrew,谢谢你的时间!我已经编辑了问题以包含所需的SQL。您不能使用LINQ或HQL吗?QueryOver就像一个半生不熟的LINQ,使用起来相当复杂。@Andrew,多亏了你关于QueryOver的系列文章,我几乎可以得到我想要的!但我仍然有一个问题:(@Ricardo,我无法用LINQ获得结果,似乎Orchard在处理其数据记录时有一些限制。现在我很接近QueryOver的解决方案,但无论如何,谢谢!
SELECT ...
FROM AgencyPartRecord this_
WHERE ...
and this_.Id in
(
SELECT this_0_.AgencyPartRecord_id as y0_
FROM AgencyFacilitiesPartRecord this_0_
WHERE this_0_.FacilityPartRecord_id in (@p2, @p3)
HAVING count(this_0_.FacilityPartRecord_id) = @p4
)
AgencyFacilitiesPartRecord facility = null;
var fsub = QueryOver.Of<AgencyFacilitiesPartRecord>(() => facility)
.WhereRestrictionOn(r => r.FacilityPartRecord.Id).IsIn(filter.Facilities)
.SelectList(list => list
.SelectGroup(r => r.AgencyPartRecord.Id)
)
.Where(Restrictions.Eq(
Projections.Count(Projections.Property(() => facility.FacilityPartRecord.Id)), filter.Facilities.Count));
agencies = agencies.WithSubquery.WhereProperty(a => a.Id).In(fsub);