co-6ren">
gpt4 book ai didi

c# - Crazy Query 需要一些反馈

转载 作者:行者123 更新时间:2023-11-30 20:10:27 24 4
gpt4 key购买 nike

        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. 在所有这些之后是否可以选择新的?

谢谢

最佳答案

您问题的标题用“疯狂查询”一词引起了我的兴趣,是的,您是对的,这有点疯狂。

你有一个 .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 children 。

查询现在只需选择所有类别并在 CategoryID 上执行查找去接 child 。

使用 .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], };

这就是你想要的吗?

关于c# - Crazy Query 需要一些反馈,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5058372/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com