提问人:Gordon Copestake 提问时间:1/28/2013 最后编辑:Soner GönülGordon Copestake 更新时间:1/28/2013 访问量:49577
c# / Linq 和,其中
c# / Linq sum where
问:
我有一个表格NCR,其中包含以下格式的数据:
ID | Date | Item | Type | Qty
1 | 01/01/13 | Apple | A | 1
2 | 01/01/13 | Apple | B | 1
3 | 01/01/13 | Orange | C | 1
4 | 01/01/13 | Orange | A | 2
6 | 01/01/13 | Orange | C | 1
我想生成一个 linq 查询,它为我提供了给定日期的类型和总和的摘要,如下所示:
Item | A | B | C
Apple | 1 | 1 | 0
Orange | 2 | 0 | 2
到目前为止,我有这个:
var q = data.GroupBy(l => l.Item)
.Select(g => new {
Item = g.Key,
Total = g.Sum(c => c.Qty),
A = g.Sum(c => c.Type == "A"),
B = g.Sum(c => c.Type == "B"),
C = g.Sum(c => c.Type == "C")
});
但是,我似乎无法为 g.Sum lambda 语句提供标准。如果我使用 Count(这是错误的数据),我可以给出 critera,但为什么 Sum 缺少这个?除了创建可用数据的汇总表之外,我还有什么替代方法?
答:
39赞
Jon Skeet
1/28/2013
#1
提供给的委托不是谓词;它是一个选择器。Sum
你想把财产总和吗?如果是这样,我怀疑你想要:Qty
A = g.Where(c => c.Type == "A").Sum(c => c.Qty),
B = g.Where(c => c.Type == "B").Sum(c => c.Qty),
C = g.Where(c => c.Type == "C").Sum(c => c.Qty)
(当然,您也可以按类型分组。
评论
0赞
Gordon Copestake
1/28/2013
如何使用此方法处理空值?例如,如果没有 B,我会收到“具体化值为 null”错误
0赞
Jon Skeet
1/28/2013
@GordonCopestake:你不应该 - 应该返回 0。您确定没有获得属性为 0 的值吗?Sum
Qty
2赞
Pranay Rana
1/28/2013
@GordonCopestake如果 qty 是可以为 null 的字段,您可以像这样执行以下操作:Sum(c => c.Qty?0) 或 Sum(c => (c.Qty == null ? 0 : c.Qty))
评论