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.Facilities
是List<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
)
我在做什么错?
谢谢!
有两件事 - 你在混合LINQ和QueryOver,你不能这样做。还有什么是你想要生成的SQL?从那里开始往往是最有帮助的。 – 2014-12-02 19:54:47
@安德鲁,感谢您的时间!我编辑了这个问题以包含所需的SQL。 – 2014-12-03 09:40:49
你不能使用LINQ或HQL吗? QueryOver就像一个不完整的LINQ,使用起来相当复杂。 – 2014-12-03 10:47:48