Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.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
Join 具有联接、组和计数的Linq查询(扩展格式)_Join_Linq Extensions - Fatal编程技术网

Join 具有联接、组和计数的Linq查询(扩展格式)

Join 具有联接、组和计数的Linq查询(扩展格式),join,linq-extensions,Join,Linq Extensions,我有一个表,它存储一些信息并引用(列parent_ID)到同一个表中的父行 我需要获得所有记录的列表(使用Linq扩展格式)和子记录的计数。这是一个SQL查询,它为我提供了所需的信息 Select a.ID, a.Name, Count(b.ID) from Table a left join Table b on b.parent_ID=a.ID group by a.ID, a.Name 例子 结果应该是: 我试着至少让孩子们数数,但没用。。。 这个查询不应该等价于

我有一个表,它存储一些信息并引用(列parent_ID)到同一个表中的父行

我需要获得所有记录的列表(使用Linq扩展格式)和子记录的计数。这是一个SQL查询,它为我提供了所需的信息

    Select a.ID, a.Name, Count(b.ID) from Table a
    left join Table b on b.parent_ID=a.ID
    group by a.ID, a.Name
例子 结果应该是: 我试着至少让孩子们数数,但没用。。。 这个查询不应该等价于这样的东西吗:

    select parent_ID, count(parent_ID) from Table group by Table
但对于每一行,它返回count=1


如何使用linq扩展格式进行这样的查询?

我相信您正在寻找的是一个组联接,使用linq查询语法而不是linq扩展更容易理解,因此为了便于理解,我将发布这两种方法

我将ID上的表与父ID自连接到一个对象中,该对象为您保持引用完整性,并选择一个匿名对象来选择父对象,然后选择所有子对象

这是使用直接LINQ查询语法

    var model = from t1 in _db.Test1
                join t2 in _db.Test1 on t1.ID equals t2.parent_ID into c1
                select new {Parent = t1, Children = c1};
下面是使用LINQ扩展的代码

    var model2 = _db.Test1.GroupJoin(_db.Test1, 
                     t1 => t1.ID, 
                     t2 => t2.parent_ID,
                     (t1, c1) => new {Parent = t1, Children = c1});
我使用了一个快速测试程序,将结果发布到两种方法的文本框中,但是代码是相同的,所以我只发布一次

    foreach (var test in model)
    {
        textBox1.AppendTextAddNewLine(String.Format("{0}: {1}", 
                                      test.Parent.Name, 
                                      test.Children.Count()));
    }
这两项试验的结果如下所示:

    First: 2
    Child1: 1
    Child2: 0
    Child1.1: 0

    First: 2
    Child1: 1
    Child2: 0
    Child1.1: 0

我相信您正在寻找的是一个组联接,使用linq查询语法而不是linq扩展更容易理解,因此为了便于理解,我将发布这两种方法

我将ID上的表与父ID自连接到一个对象中,该对象为您保持引用完整性,并选择一个匿名对象来选择父对象,然后选择所有子对象

这是使用直接LINQ查询语法

    var model = from t1 in _db.Test1
                join t2 in _db.Test1 on t1.ID equals t2.parent_ID into c1
                select new {Parent = t1, Children = c1};
下面是使用LINQ扩展的代码

    var model2 = _db.Test1.GroupJoin(_db.Test1, 
                     t1 => t1.ID, 
                     t2 => t2.parent_ID,
                     (t1, c1) => new {Parent = t1, Children = c1});
我使用了一个快速测试程序,将结果发布到两种方法的文本框中,但是代码是相同的,所以我只发布一次

    foreach (var test in model)
    {
        textBox1.AppendTextAddNewLine(String.Format("{0}: {1}", 
                                      test.Parent.Name, 
                                      test.Children.Count()));
    }
这两项试验的结果如下所示:

    First: 2
    Child1: 1
    Child2: 0
    Child1.1: 0

    First: 2
    Child1: 1
    Child2: 0
    Child1.1: 0

谢谢,但在这种情况下,我将获得大量数据-我不需要所有的子行-只需要它们的计数…接受答案,因为它帮助我获得了必要的结果(答案的编辑部分)。我不确定您是想要计数还是实际的子行,但您可以轻松添加。count()到c1的末尾,孩子们只参与计数,但正如你所说,你已经解决了。谢谢,但在这种情况下,我将获得大量数据-我不需要所有的孩子行-只是他们的计数…接受了答案,因为它帮助我得到了必要的结果(答案的编辑部分)我不确定您是想要计数还是实际的子项,但是您可以很容易地将.count()添加到c1的末尾,其中子项仅用于获取计数,但正如您所说,您已经解决了这个问题。