我有一个数据表,可以保存数据:
Date OperationA OperationB OperationC
Today 5
Today 6
Today 7
现在,我希望它看起来像:
Date OperationA OperationB OperationC
Today 5 6 7
我已经看过LINQ Group by子句了,但这似乎是分开正在分组的数据而不是将它保留在集合中 - 作为一个LINQ新手,我可能会遗漏一些东西。 / p>
有人可以提供建议。
感谢。
答案 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列。