【发布时间】:2013-12-13 12:27:44
【问题描述】:
我有一个这样的DataTable
ProductId CountThisWeek CountLastWeek
1 10.0 15.0
1 20.0 5.0
2 5.0 10.0
2 DBNull 15.0
2 10.0 DBNull
3 DBNull 15.0
3 DBNull 15.0
我需要通过“压缩”(按 productId 求和)我的初始 DataTable 来获得一个新的 DataTable(或者,如果不是,至少是一个匿名数据结构,如字典),如下所示:
ProductId CountThisWeek CountLastWeek
1 30.0 20.0
2 15.0 25.0
3 DBNull 30.0
规则很简单:DBNull + Value = Value,DBNull + DBNull = DBNull
我尝试实现这个聚合,像这样:
(from row in table.AsEnumerable()
group row by row.Field<int>("ProductId") into g
select g).ToDictionary(
g => g.Key,
g => new {
CountThisWeek = g.Sum(r => row.Field<decimal>("CountThisWeek")),
CountLastWeek = g.Sum(r => row.Field<decimal>("CountLastWeek"))
}
但是这个 Sum 没有考虑到我的 DBNull 规则...
我不能用可为空的小数来做吗?
g.Sum(r => r.Field<decimal?>("CountThisWeek")),
所以,也许我需要做一些类似的事情
g.Aggregate((summRow, nextRow) => {
DataRow dr = summRow.Table.NewRow();
decimal? sum = summRow.Field<decimal?>("CountThisWeek");
decimal? next = nextRow.Field<decimal?>("CountThisWeek");
decimal? result = (!sum.HasValue && !next.HasValue) ?
(decimal?)null : sum ?? 0 + next ?? 0;
dr["CountThisWeek"] = result;
return dr;
}),
这是实现我尝试的最佳方式吗?
我想在聚合函数中获得decimal? 而不是DataRow...
【问题讨论】:
-
你试试
g.Sum(r => r.Field<decimal>("CountThisWeek")??0)? -
不,DbNull+DbNull 应该是“null”,而不是“0”
标签: c# linq datatable aggregate-functions