Linq连接两个表和计数列

时间:2017-01-10 05:00:55

标签: c# sql linq list c#-4.0

我有两张桌子。

表A

TableAId value value2
 1        a     b
 2        aa    bb

表B

TableBId TableAId  Status 
  1        1       success
  2        1       success
  3        2       failed
  4        2       failed

我正在尝试创建列表,如

   TableAId value value2 successCount errorCount
     1        a     b       2           0
     2        aa    bb      0           2

这是我想要创建的查询,但结果却是错误的。

 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();

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

提前致谢

1 个答案:

答案 0 :(得分:4)

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

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")
}

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