Linq 连接两个表并计数列

Owa*_*med 1 c# sql linq list c#-4.0

我有两张桌子。

表A

TableAId value value2
 1        a     b
 2        aa    bb
Run Code Online (Sandbox Code Playgroud)

表B

TableBId TableAId  Status 
  1        1       success
  2        1       success
  3        2       failed
  4        2       failed
Run Code Online (Sandbox Code Playgroud)

我想创建列表

   TableAId value value2 successCount errorCount
     1        a     b       2           0
     2        aa    bb      0           2
Run Code Online (Sandbox Code Playgroud)

这是我试图创建的查询,但我得到了错误的结果。

 var query = (from a in db.TableA.AsEnumerable()
                join b in db.TableB.AsEnumerable()
                on a.TableAId equals b.TableAId
                select
                new
                {
                    TableAId = a.TableAId,
                    value = a.value,
                    value2 = a.value2,
                    successCount = b.Status.Count(t => t.ToString() == "success"),
                    errorCount = b.Status.Count(t => t.ToString() == "failed")
                }).ToList();
Run Code Online (Sandbox Code Playgroud)

任何帮助我如何更正查询的帮助将不胜感激。

提前致谢

Mar*_*zek 5

您需要先按某些内容对行进行分组,否则计数没有意义。

from a in db.TableA
join b in db.TableB on a.TableAId equals b.TableAId
group b by a into g
select new
{
    TableAId = g.Key.TableAId,
    value = g.Key.value,
    value2 = g.Key.value2,
    successCount = g.Count(t => t.Status == "success"),
    errorCount = g.Count(t => t.Status == "failed")
}
Run Code Online (Sandbox Code Playgroud)

我还删除AsEnumerable了将连接、分组和计数移动到数据库的调用 - 在使用 LINQ to Objects 执行查询之前,您的查询将所有行带入应用程序内存,这在 99.9% 的情况下不是您想要的。