Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/design-patterns/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/webpack/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Linq to sql 使用Linq查询分层表/复合模式中的终端/叶节点_Linq To Sql_Design Patterns_Composite_Hierarchical - Fatal编程技术网

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

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

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

我想要的是使用LINQtoSQL查询自身与其他子类别无关的子类别,即它们是某些给定类别或子类别的直接叶节点

最简单的部分,我得到了,就是得到了子类别。把代码放在这里几乎很尴尬。但我们确实喜欢看代码

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)