Orchard中的NHibernate JoinQueryOver查询

Orchard中的NHibernate JoinQueryOver查询,nhibernate,orchardcms,Nhibernate,Orchardcms,我有一个果园网站。有两个关联实体:代理机构(AgencyPartRecord)和设施(FacilityPartRecord),它们与AgencyFacilitiePartRecord以n对n的方式连接。以下是相应的记录: public class AgencyPartRecord : ContentPartRecord { ... public virtual IList<AgencyFacilitiesPartRecord> AgencyFacilitiesP

我有一个果园网站。有两个关联实体:代理机构(AgencyPartRecord)和设施(FacilityPartRecord),它们与AgencyFacilitiePartRecord以n对n的方式连接。以下是相应的记录:

 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);