我有以下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在不同的地方但我调试时仍然得到相同的结果。
答案 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)
我个人喜欢使用可空值类型的HasValue
和Value
属性,它们将是:
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