我有这些实体类:
class OuterLevel
{
ICollection<MidLevel> mid_items;
... other properties
}
class MidLevel
{
OuterLevel parent;
Inner1 inner1;
Inner2 inner2;
... other properties
}
class Inner1
{
int id;
string description;
}
class Inner2
{
int id;
string description;
}
我需要构建一个Linq查询,该查询返回一个OuterLevel对象列表,其中所有子项都已正确填充。 假设所有映射都是正确且有效的,我在这里找到的难点是得到的查询应该是类似的
SELECT * FROM OuterLevelTable OLT INNER JOIN MidLevelTable MLT ON (MLT.parentID = OLT.ID) INNER JOIN
Inner1Table ON (MLT.Inner1ID = Inner1Table.ID) INNER JOIN
Inner2Table ON (MLT.Inner2ID = Inner2Table.ID)
WHERE (Inner1Table.someproperty1 = somevalue1) AND (Inner2Table.someproperty2 = somevalue2)
主要问题是两个连接从MidLevel对象开始向下层次结构,所以我无法确定哪个Fetch和FetchMany组合可以使用,而不会将结果查询连接两次MidLevelTable,如下所示:
return All().FetchMany(x => x.mid_items).ThenFetch(x => x.inner1).FetchMany(x => x.mid_items).ThenFetch(x => x.inner2);
我想返回一个可以进一步过滤的IQueryable,所以我宁愿避免使用Query和QueryOver。
提前致谢, 马里奥
答案 0 :(得分:0)
您想要的是不可能的,因为当您对连接的表进行过滤时,结果记录不足以填充集合。您最好在一个地方构建查询以进一步调整它或设置集合批量大小以降低SELECT N + 1.