3

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

“孩子”是 Linq 给自引用关联的名称。

4

2 回答 2

2

您的解决方案是正确的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() 的解决方案应该是正确的。

于 2009-01-06T00:58:37.607 回答
0

我想如果我正确理解您的问题,您正在尝试获取所有没有自己的子元素的子元素......这个查询自身加入表以测试该节点是否用作父节点,如果它是不是然后它显示在结果中。

我不确定这是否有效,因为我没有什么可以测试它...

   (from c in context
    join cc in context on c.id equals cc.parentid into temp
    from t in temp.DefaultIfEmpty()
    where t == null
    select c).ToList()
于 2009-01-06T00:56:57.720 回答