我有一个表,它将一些信息和引用(列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扩展格式进行此类查询?
答案 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