疯狂查询需要一些反馈

时间:2011-02-20 16:38:17

标签: c# linq linq-to-entities

        var query =context.Categories.Include("ChildHierarchy")
             .Where(c =>
                 context.CategoryHierarchy.Where(ch => ch.ParentCategoryID == ch.ParentCategoryID)
                 .Select(ch => ch.ChildCategoryID).Contains(c.CategoryID));

问题:

  1. 我需要包含其他导航程序中的一些数据(“.Include(”otherprop“)”)
  2. 在所有这些之后是否可以选择新的?
  3. 由于

2 个答案:

答案 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 });