gpt4 book ai didi

linq-to-sql - 使用 Linq to 查询分层表/复合模式中的终端/叶节点

转载 作者:行者123 更新时间:2023-12-02 15:15:26 25 4
gpt4 key购买 nike

我有一个带有 Id、CategoryName 和 ParentId 的自引用表。这是类别层次结构表的典型场景,类别表本身可以分为数据库专家告诉我的类别,称为邻接模型。

我想要的是使用 Linq to SQL 查询本身与其他子类别无关的子类别,即它们是某个给定类别或子类别的直接叶节点。

最简单的部分,我知道,就是获取子类别。都不好意思把代码放在这里了。但我们确实喜欢看到代码..

IList<Categories> subcategories = context.Where( c => c.ParentId == 1).ToList();  

但是将其范围缩小到没有子类别的类别让我转变了态度。任何帮助将不胜感激。

谢谢你的帮助。杰夫

更新**看来这可行,但如果有人能确认它是“正确的”,我将不胜感激。因此,如果我想要 Id = 1 的类别下的叶节点,我会这样做:

Categories.Where( c => !c.Children.Any ( d => d.ParentId == c.Id)).Where( e => e.ParentId == 1) 

“Children”是 Linq 为自引用关联指定的名称。

最佳答案

您的解决方案是正确的,因为 Any() 方法会转换为 sql“EXISTS()”函数和 !c.Children.Any ( d => d.ParentId == c.Id)) 转换为类似于 NOT EXISTS (SELECT * FROM Categories WHERE ParentID =outerRef. ID)

另一种方法是使用Count:

Categories.Where( c => c.Children.Count(d => d.ParentId == c.Id) == 0).Where( e => e.ParentId == 1)

但通常 EXISTS() 在 SQL 中优于 COUNT()(出于性能原因),因此使用 Any() 的解决方案应该是正确的。

关于linq-to-sql - 使用 Linq to 查询分层表/复合模式中的终端/叶节点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/414945/

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