LINQ Datatable返回0而不是null合并

时间:2014-02-07 12:29:20

标签: c# linq

我有以下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在不同的地方但我调试时仍然得到相同的结果。 enter image description here

4 个答案:

答案 0 :(得分: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 :(得分: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 )
)};

答案 2 :(得分: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))
                   } ;

答案 3 :(得分:0)

你试过吗

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

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