Linq to sql 使用Linq查询分层表/复合模式中的终端/叶节点
我有一个具有Id、CategoryName和ParentId的自引用表。这是一个典型的场景,类别的层次表本身可以划分为类别,DB专家告诉我称之为邻接模型 我想要的是使用LINQtoSQL查询自身与其他子类别无关的子类别,即它们是某些给定类别或子类别的直接叶节点 最简单的部分,我得到了,就是得到了子类别。把代码放在这里几乎很尴尬。但我们确实喜欢看代码Linq to sql 使用Linq查询分层表/复合模式中的终端/叶节点,linq-to-sql,design-patterns,composite,hierarchical,Linq To Sql,Design Patterns,Composite,Hierarchical,我有一个具有Id、CategoryName和ParentId的自引用表。这是一个典型的场景,类别的层次表本身可以划分为类别,DB专家告诉我称之为邻接模型 我想要的是使用LINQtoSQL查询自身与其他子类别无关的子类别,即它们是某些给定类别或子类别的直接叶节点 最简单的部分,我得到了,就是得到了子类别。把代码放在这里几乎很尴尬。但我们确实喜欢看代码 IList<Categories> subcategories = context.Where( c => c.ParentId
IList<Categories> subcategories = context.Where( c => c.ParentId == 1).ToList();
Children是Linq给出的自引用关联的名称。我想如果我正确理解了您的问题,您正在尝试获取所有没有子元素的子元素。。。此查询在自身上自联接表,以测试节点是否用作父节点,如果不是,则在结果中显示 我不确定这是否有效,因为我没有什么可测试的
(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()
您的解决方案是正确的,因为Any方法转换为sql EXISTS函数 和c、 任何d=>d.ParentId==c.Id转换为类似于NOT EXISTS SELECT*FROM Categories的sql子句,其中ParentId=outerRef.Id 另一种方法是使用Count:
但出于性能原因,通常EXISTS首选在sql中计数,因此使用Any的解决方案应该是正确的 这似乎是可行的,但如果有人能证实这是正确的,我将不胜感激。所以,如果我想让叶节点位于Id=1的类别下,我会这样做:Categories.Where c=>!c、 任何d=>d.ParentId==c.Id.e=>e.ParentId==1
(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()
Categories.Where( c => c.Children.Count(d => d.ParentId == c.Id) == 0).Where( e => e.ParentId == 1)