多列上的LINQ COUNT

gfr*_*zle 6 .net sql linq linq-to-sql

如果我有一个包含标题列和3位列(f1,f2,f3)的表,其中包含1或NULL,那么如何编写LINQ以返回包含每个位列的计数为1的标题?我正在寻找相当于这个SQL查询:

SELECT title, COUNT(f1), COUNT(f2), COUNT(f3) FROM myTable GROUP BY title
Run Code Online (Sandbox Code Playgroud)

我正在寻找"最好"的方式来做到这一点.当你查看底层SQL时,我提出的版本会进入表中4次,所以它太慢了.

gfr*_*zle 0

这是我想出的解决方案。请注意,它接近 @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))
Run Code Online (Sandbox Code Playgroud)

第一个查询进行分组,但 ToList 从服务器按原样获取分组数据。消除此处的计数可以防止生成的 SQL 语句为每个计数生成子 SELECT。我在本地第二个查询中进行计数。

这是有效的,因为我知道第一个查询将返回可管理的行数。如果它返回数百万行,我可能不得不转向另一个方向。

  • 不要将其用于大型数据集!请不要将其复制并粘贴到您的应用程序中。这个答案应该有一个巨大的警告。 (2认同)