1

我有一个表,它存储一些信息和引用(列 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 扩展格式进行这样的查询?

4

1 回答 1

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
于 2013-02-12T18:50:49.480 回答