如果我有一个包含标题列和3个包含1或NULL的位列(f1,f2,f3)的表,我将如何编写LINQ以返回包含每个位列的计数为1的标题?我正在寻找与此SQL查询等效的方法:
SELECT title, COUNT(f1), COUNT(f2), COUNT(f3) FROM myTable GROUP BY title
我正在寻找做到这一点的“最佳”方法。当您查看基础SQL时,我想出的版本会四次进入表中,因此它太慢了。
这是我想出的解决方案。请注意,它与@OdeToCode提出的解决方案非常接近(但使用VB语法),但有一个主要区别:
Dim temp = _ (From t In context.MyTable _ Group t.f1, t.f2, t.f3 By t.title Into g = Group _ Select title, g).ToList Dim results = _ From t In temp _ Select t.title, _ f1_count = t.g.Count(Function(x) If(x.f1, False)), _ f2_count = t.g.Count(Function(x) If(x.f2, False)), _ f3_count = t.g.Count(Function(x) If(x.f3, False))
第一个查询进行分组,但是ToList从服务器按原样获取分组的数据。在这里消除计数可以防止生成的SQL语句为每个计数生成子SELECT。我在本地第二个查询中进行计数。
这行得通,因为我知道第一个查询将返回可管理的行数。如果要返回数百万行,我可能不得不朝另一个方向前进。