Join 具有联接、组和计数的Linq查询(扩展格式)
我有一个表,它存储一些信息并引用(列parent_ID)到同一个表中的父行 我需要获得所有记录的列表(使用Linq扩展格式)和子记录的计数。这是一个SQL查询,它为我提供了所需的信息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 例子 结果应该是: 我试着至少让孩子们数数,但没用。。。 这个查询不应该等价于
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的末尾,其中子项仅用于获取计数,但正如您所说,您已经解决了这个问题。