LINQ Datatable返回0而不是null合并

4

我有以下的LINQ语句,从一个数据表中计算出3个值。有时这些值中可能包含null。 我该如何将null替换为0。

var striko2scrap = from myrow in Scrap.AsEnumerable()
                   where myrow.Field<string>("MachineID") == "Striko 2"
                   group myrow by myrow.Field<string>("MachineID") == "Striko 2" into g
                   select new
                   {
                        TotalScrap = g.Sum(x => x.Field<int?>("Runners") ?? 
                                         0 + x.Field<int?>("HouseIngots") ?? 
                                         0 + x.Field<int?>("Other") ?? 
                                         0)
                   } ;

我已经在不同的位置尝试了 ?? 0,但是当我调试时,仍然得到相同的结果。 这里输入图片描述

4个回答

5
你面临的问题是运算符优先级。我认为你想要做的是将null视为0处理。代码如下:
int? a = null;
int? b = 1;
int? c = 2;

int result = (a ?? 0) + (b ?? 0) + (c ?? 0); // 3

你所写的相当于:
int result = a ?? (0 + b) ?? (0 + c) ?? 0; // 1

所以你要做的就是修改g.Sum(x => ...),这样它才能按照意图工作。


1

我个人喜欢使用可空值类型的HasValueValue属性,它们分别是:

select new
{
    TotalScrap = g.Sum(x => 
      (x.Field<int?>("Runners").HasValue ? x.Field<int?>("Runners").Value : 0 ) +
      (x.Field<int?>("HouseIngots").HasValue ? x.Field<int?>("HouseIngots").Value : 0 ) +
      (x.Field<int?>("Other").HasValue ? x.Field<int?>("Other").Value : 0 )
)};

但如果你喜欢使用??符号,你可以这样写:

select new
{
    TotalScrap = g.Sum(x => 
      (x.Field<int?>("Runners") ?? 0 ) +
      (x.Field<int?>("HouseIngots") ?? 0 ) +
      (x.Field<int?>("Other") ?? 0 )
)};

0

你试过了吗?

x.Field<int?>("Runners").Value ?? 0

或者

x.Field<int?>("Runners").HasValue ? x.Field<int?>("Runners") : 0

0

试试这个:

var striko2scrap = from myrow in Scrap.AsEnumerable()
                   where myrow.Field<string>("MachineID") == "Striko 2"
                   group myrow by myrow.Field<string>("MachineID") == "Striko 2" into g
                   select new
                   {
                        TotalScrap = g.Sum(x => 
                            (x.Field<int?>("Runners") ?? 0) +
                            (x.Field<int?>("HouseIngots") ?? 0) +
                            (x.Field<int?>("Other") ?? 0))
                   } ;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接