LINQ - 将数字存储为字符串

时间:2012-01-18 20:58:10

标签: c# linq entity-framework-4 linq-to-entities

我有以下数据:

PK    OrderNumber      USERDEFFIELD
1     0001             10
2     0001             25
3     0002             20
4     0002             22
5     0002             NULL
6     0003             ABC123

UserDefField列在数据库中是VARCHAR类型。使用LINQ,我如何获得每个订单的SUM(UserDefField)? UserDefField的NULL和非数字值将被视为零。我想要的结果是:

OrderNumber  TotalQty
0001         35
0002         42
0003          0

如果UserDefField是严格可以为空的数字字段我知道我会在foreach循环中执行此操作:

 TotalQtyForThisOrder = orders.Sum(w => w.UserDefField ?? 0 );

但对于字符串字段,应该怎么做?非常感谢你的帮助。

3 个答案:

答案 0 :(得分:6)

TotalQtyForThisOrder = orders.Sum( w = > {
            int result;
            Int32.TryParse(w.UserDefField, out result);
            return result;
});

答案 1 :(得分:6)

从根本上说,我会说你的架构是关闭的:如果你将文本值视为一个数字,如果它恰好是可解析的那样,那么你真的要反对合理的设计。

我不知道你怎么能写一个LINQ查询来使这个总和出现在数据库中。您可能想要编写一些自定义转换函数,或者可能是一个自定义视图,它执行“尝试解析它并返回0否则”操作。

你可以在LINQ to Objects中轻松完成:

x = orders.Select(y => y.UserDefField) // To just bring down the right values
          .AsEnumerable()
          .Sum(text => {
                   int result;
                   // We don't care about the return value... and
                   // it even handles null input. (In any error condition,
                   // "result" will be 0 afterwards.)
                   int.TryParse(text, out result);
                   return result;
               });

...但我确实建议您尽可能重新访问您的架构。

答案 2 :(得分:1)

我会像这样使用Aggregate函数:

var result = orders.Aggregate(new Dictionary<OrderIdType, int>(), (accumulator, item) => {
    int quantity;
    if (!int.TryParse(item.USERDEFFIELD, out quantity))
        quantity = 0;
    if (!accumulator.ContainsKey(item.OrderId))
       accumulator[item.OrderId] = quantity;
    else
       accumulator[item.OrderId] += quantity;
    return accumulator;
});