C#Linq查询 - Groupby

时间:2011-02-23 15:50:16

标签: c# linq

我有一个数据表,可以保存数据:

Date OperationA OperationB OperationC

Today    5
Today               6
Today                          7

现在,我希望它看起来像:

Date OperationA OperationB OperationC

Today    5          6          7

我已经看过LINQ Group by子句了,但这似乎是分开正在分组的数据而不是将它保留在集合中 - 作为一个LINQ新手,我可能会遗漏一些东西。 / p>

有人可以提供建议。

感谢。

2 个答案:

答案 0 :(得分:3)

class Operation
{
    public DateTime Date { get; set; }
    public int OperationA { get; set; }
    public int OperationB { get; set; }
    public int OperationC { get; set; }
}

var operations = LoadData();
var result = operations.GroupBy(o => o.Date)
                   .Select(g => new Operation
                    {
                        Date = g.Key,
                        OperationA = g.Sum(o => o.OperationA),
                        OperationB = g.Sum(o => o.OperationB),
                        OperationC = g.Sum(o => o.OperationC)
                    });
P:你的数据库设计看起来很奇怪。我觉得这个表应该是这样的:

Date       Operation     Type
2010-1-1      5           A
2010-1-1      6           B
2010-1-1      7           C

答案 1 :(得分:2)

LINQ 项目 - 也就是说,它根据输入序列生成一个新序列。换句话说,它始终是只读的,它永远不会写入,永远不会修改原始序列,也不会产生副作用。

其次,GroupBy会生成一个IGrouping,这是一种特殊的IEnumerable<T>,带有一个名为Key的额外属性 - 这是这些项共有的唯一值,并被分组。

因此,在您的情况下,GroupBy将通过按日期对行进行聚类来创建稍微接近最终目标的数据结构:

var operationClusters = myDataTable.Rows.OfType<DataRow>().GroupBy(row => row["Date"]);

但您仍需要提供将值折叠为单行的逻辑 - 例如,5是所需值,而null不适用于OperationA列。