小编典典

LINQ COUNT多列

sql

如果我有一个包含标题列和3个包含1或NULL的位列(f1,f2,f3)的表,我将如何编写LINQ以返回包含每个位列的计数为1的标题?我正在寻找与此SQL查询等效的方法:

SELECT title, COUNT(f1), COUNT(f2), COUNT(f3) FROM myTable GROUP BY title

我正在寻找做到这一点的“最佳”方法。当您查看基础SQL时,我想出的版本会四次进入表中,因此它太慢了。


阅读 195

收藏
2021-03-23

共1个答案

小编典典

这是我想出的解决方案。请注意,它与@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。我在本地第二个查询中进行计数。

这行得通,因为我知道第一个查询将返回可管理的行数。如果要返回数百万行,我可能不得不朝另一个方向前进。

2021-03-23