在代码中执行结果集分组,而不是在数据库级别上

Nin*_*omb 3 .net vb.net asp.net grouping

Stackoverflowers,

我有一个SQL查询的结果集,形式如下:

Category  Column2   Column3
A         2        3.50  
A         3        2  
B         3        2  
B         1        5  
...
Run Code Online (Sandbox Code Playgroud)

我需要根据Category列对结果集进行分组,并对Column2和Column3的值求和.我必须在代码中执行此操作,因为由于查询的复杂性(长篇故事),我无法在获取数据的SQL查询中执行分组.然后,该分组数据将显示在表格中.

我让它适用于Category列中的特定值集,但我想要一个解决方案来处理Category列中出现的任何可能的值.

我知道必须有一种简单有效的方法,但我现在无法绕过它.你会怎么做到的?

编辑

我试图使用Thomas Levesque建议的完全相同的分组查询将结果分组到SQL中,并且我们的整个RDBMS都试图处理查询.

我认为Linq在.NET 3.5之前不可用.这是一个.NET 2.0 Web应用程序,所以我认为这不是一个选项.我错了吗?

编辑

开始赏金,因为我相信这将是一个很好的技术,无论在哪里使用不同的结果集,工具箱都可以使用.我相信知道最简洁的方法来对代码中的任何2个有点相似的数据集进行分组(没有.NET LINQ)对于更多人而言不仅仅对我有益.

编辑

这是我在VB.NET中提出的解决方案,以防任何人需要它.它以Paul Williams的答案为出发点.我直接从datareader获取值:

Public Class Accumulator
    Public sum1 As Integer
    Public sum2 As Decimal
End Class

If IReader.HasRows Then
    Dim grouping As New Dictionary(Of String, Accumulator)

    Do While IReader.Read
        Dim sum As New Accumulator

        If grouping.ContainsKey(IReader.GetString(0)) Then
            sum = grouping.Item(IReader.GetString(0))
        Else
            sum = New Accumulator
            grouping.Item(IReader.GetString(0)) = sum
        End If

        sum.sum1+= IReader.GetInt32(1)
        sum.sum2 += IReader.GetInt32(2)
    Loop

    For Each key As KeyValuePair(Of String, Accumulator) In grouping
        "DO WHAT YOU NEED TO DO WITH THE VALUES HERE"
    Next
End If
Run Code Online (Sandbox Code Playgroud)

Tho*_*que 5

由于查询的复杂性,我无法在获取数据的SQL查询中执行分组(长篇故事)

你确定吗 ?你只需要SELECT ... GROUP BY ...在复杂的查询中加上一个声明:

SELECT Category, SUM(Column2), SUM(Column3)
FROM ( /* your query here */ )
GROUP BY Category
Run Code Online (Sandbox Code Playgroud)

无论如何,如果你真的想在代码中做到这一点,最简单的方法是使用Linq.假设结果存储在对象列表中:

var groupedByCategory =
                    from r in results
                    group r by r.Category into g
                    select new
                    {
                        Category = g.Key,
                        SumOfColumn2 = g.Sum(x => x.Column2),
                        SumOfColumn3 = g.Sum(x => x.Column3)
                    };
Run Code Online (Sandbox Code Playgroud)

UPDATE

我试图使用Thomas Levesque建议的完全相同的分组查询将结果分组到SQL中,并且我们的整个RDBMS都试图处理查询.

呃......你使用哪个DBMS?只是为了确保我不会意外地使用它;)

我认为Linq在.NET 3.5之前不可用.这是一个.NET 2.0 Web应用程序,所以我认为这不是一个选项.我错了吗?

不,你是对的.Linq附带.NET 3.5,在早期版本中不可用.

但是,如果您碰巧使用VS2008构建面向.NET 2.0的应用程序,您可能会感兴趣LinqBridge:它是标准Linq运算符的替代实现,它不依赖于.NET 3.5.你只需要一个C#3编译器(VS2008附带)