【问题标题】:c# / Linq sum wherec#/Linq sum where
【发布时间】:2013-01-11 17:58:19
【问题描述】:

我有一个表格 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 (这是错误的数据),我可以给出标准,但为什么 Sum 缺少这个?除了创建可用数据的汇总表之外,我还有什么替代方法?

【问题讨论】:

    标签: c# asp.net linq


    【解决方案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)
    

    (当然,您也可以按类型分组。)

    【讨论】:

    • 如何用这种方法处理空值?例如,如果没有 B,我会收到“物化值为空”错误
    • @GordonCopestake:你不应该 - Sum 应该返回 0。你确定你没有得到一个 Qty 属性为 0 的值吗?
    • @GordonCopestake 如果 qty 是可为空的字段,那么您可能会这样做 Sum(c => c.Qty?0) 或 Sum(c => (c.Qty == null ? 0 : c .数量))
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-17
    相关资源
    最近更新 更多