var query =context.Categories.Include("ChildHierarchy")
.Where(c =>
context.CategoryHierarchy.Where(ch => ch.ParentCategoryID == ch.ParentCategoryID)
.Select(ch => ch.ChildCategoryID).Contains(c.CategoryID));
问题:
由于
答案 0 :(得分:6)
你问题的标题引起了我的反思“疯狂的查询”,是的,你是对的,这有点疯狂。
您有一个.Where(...)
子句,其中包含以下谓词:
ch => ch.ParentCategoryID == ch.ParentCategoryID
现在这将永远是真的。所以我想你正在尝试做别的事情。我会对我答案结尾处的内容有所了解。
然后,我对您的查询进行了一些清理,以便更好地了解您正在做的事情。这就是它现在的样子:
var query =
context
.Categories
.Where(c => context
.CategoryHierarchy
.Select(ch => ch.ChildCategoryID)
.Contains(c.CategoryID));
因此,我不建议使用嵌套查询,而是建议在可读性和性能方面可能更好:
var query =
from c in context.Categories
join h in context.CategoryHierarchy
on c.CategoryID equals h.ChildCategoryID into ghs
where ghs.Any()
select c;
这会得到与您的查询相同的结果,所以希望这会有所帮助。
我确实得到的印象是,您要尝试进行查询,以便返回每个类别以及它可能具有的任何子类别。如果是这种情况,则需要查询:
var lookup =
(from c in context.Categories
join h in context.CategoryHierarchy
on c.CategoryID equals h.ChildCategoryID
select new { ParentCategoryID = h.ParentCategoryID, Category = c, }
).ToLookup(x => x.ParentCategoryID, x => x.Category);
var query =
from c in context.Categories
select new { Category = c, Children = lookup[c.CategoryID], };
lookup
查询首先对类别和类别层次结构进行连接,以返回所有子类别及其关联的ParentCategoryID
,然后创建从ParentCategoryID
到关联列表的查找Category
孩子。
查询现在只需选择所有类别并在CategoryID
上执行查找以获取子项。
使用.ToLookup(...)
方法的优点是,它可以轻松地包含没有子项的类别。与使用Dictionary<,>
不同,当您使用没有值的键时,查找不会引发异常 - 而是返回一个空列表。
现在,您也可以添加回.Include(...)
来电。
var lookup =
(from c in context.Categories
.Include("ChildHierarchy")
.Include("otherprop")
join h in context.CategoryHierarchy
on c.CategoryID equals h.ChildCategoryID
select new { ParentCategoryID = h.ParentCategoryID, Category = c, }
).ToLookup(x => x.ParentCategoryID, x => x.Category);
var query =
from c in context.Categories
.Include("ChildHierarchy")
.Include("otherprop")
select new { Category = c, Children = lookup[c.CategoryID], };
这就是你要追求的吗?
答案 1 :(得分:1)
1)然后添加它 - context.Categories.Include("ChildHierarchy").Include("OtherCollection");
2)当然,是的
var query = context.Categories
.Include("ChildHierarchy")
.Include("OtherProp")
.Where(c => context.CategoryHierarchy.Where(ch => ch.ParentCategoryID == ch.ParentCategoryID)
.Select(ch => ch.ChildCategoryID).Contains(c.CategoryID))
.Select(c => new { c.A, c.B, c.etc });