我有两张桌子。
表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();
任何帮助我如何纠正查询将不胜感激。
提前致谢
答案 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%的情况下不是你想要什么。