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