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

标签 linq-to-sql design-patterns composite hierarchical

我有一个带有 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/

相关文章:

c# - 在 linq 表映射中将多个表分配给单个类

linq - SingleOrDefault()在多个元素上引发异常

c# - 与 Linq To Sql 和 ASP.NET 的并发

c# - 是否有任何标准方法或设计模式来处理这个问题?

java - Gradle 复合项目 : "Could not resolve" even with correct paths

c++ - 复合模式 : Copy tree structure

.net - ASP.NET MVC 中的 LINQ to SQL 导致 DuplicateKeyException

构造函数中的 JavaScript 访问器属性

oop - 模板方法和策略设计模式

ffmpeg - 使用 ffmpeg 合成 2 个视频(.mov)文件