2014-12-02 73 views
1

我有一个Orchard网站。有两个连接的实体:机构(AgencyPartRecord)和设施(FacilityPartRecord),它们与AgencyFacilitiesPartRecord进行n对n连接。这里有相应的记录:在Orchard的NHibernate JoinQueryOver查询

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:

SELECT * 
FROM AgencyPartRecord 
WHERE Id IN 
(
    SELECT a.AgencyPartRecord_Id 
    FROM AgencyFacilitiesPartRecord a    
    WHERE a.FacilityPartRecord_Id IN (... filter values here ...) 
    GROUP BY a.AgencyPartRecord 
    HAVING COUNT(a.Id) = <number of filter values> 
) 

我写了下面的查询(filter.FacilitiesList<int>类型):

IQueryOver<AgencyPartRecord, AgencyPartRecord> agencies = ... // apply other filters 
AgencyFacilitiesPartRecord facility = null;  

var fsub = QueryOver.Of<AgencyFacilitiesPartRecord>(() => facility)      
       .WhereRestrictionOn(r => r.FacilityPartRecord.Id).IsIn(filter.Facilities) 
       .SelectList(list => 
        list        
         .SelectGroup(a => a.AgencyPartRecord.Id) 
         .SelectCount(a => a.FacilityPartRecord.Id)) 
       .Where(Restrictions.Eq(
        Projections.Count(
         Projections.Property(() => facility.FacilityPartRecord.Id)), filter.Facilities.Count)) 
       .SelectList(list => list.Select(a => a.AgencyPartRecord.Id)); 


agencies = agencies 
       .WithSubquery.WhereProperty(a => a.Id).In(fsub); 

问题是这样的查询不在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 
) 

我在做什么错?

谢谢!

+0

有两件事 - 你在混合LINQ和QueryOver,你不能这样做。还有什么是你想要生成的SQL?从那里开始往往是最有帮助的。 – 2014-12-02 19:54:47

+0

@安德鲁,感谢您的时间!我编辑了这个问题以包含所需的SQL。 – 2014-12-03 09:40:49

+0

你不能使用LINQ或HQL吗? QueryOver就像一个不完整的LINQ,使用起来相当复杂。 – 2014-12-03 10:47:48

回答

1

我终于明白了! :) 正确的代码是:

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

安德鲁,你QueryOver系列(http://blog.andrewawhitaker.com/queryover-series/)再次感谢!