具有连接,组和计数的Linq查询(扩展格式)

时间:2013-02-12 17:57:31

标签: 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

实施例

|    ID   | Name     | parent_ID |
----------------------------------
|    1    | First    |   null    |
|    2    | Child1   |    1      |
|    3    | Child2   |    1      |
|    4    | Child1.1 |    2      |

结果应为:

|    1    | First    |    2      |
|    2    | Child1   |    1      |
|    3    | Child2   |    0      |
|    4    | Child1.1 |    0      |

我试图至少计算子计数,但它不起作用......

    var model = _db.Table 
            .GroupBy(r => new { r.parent_ID })
            .Select(r => new {
                r.Key.parent_ID,
                ChildCount = r.GroupBy(g => g.parent_ID).Count() 
            });

此查询不应与以下内容等效:

    select parent_ID, count(parent_ID) from Table group by Table

但每行返回count = 1 ......

如何使用linq扩展格式进行此类查询?

1 个答案:

答案 0 :(得分:1)

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

我将ID上的表连接到parent_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