decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity"));
如果列包含null,则会引发Exception.so我想返回零而不是Exception
答案 0 :(得分:1)
根据文档http://msdn.microsoft.com/en-us/library/bb360891(v=vs.110).aspx,对于Value为null但仅支持可空引用类型的情况,数据集的Field扩展已经返回null。 它不支持十进制等可空类型吗?解析小数时会抛出异常。
因此,您必须手动检查字段的DBNull,然后进行转换。 通常它会返回DBNull,但扩展已经处理了。
所以你可以简单地在linq表达式中检查Null,就像这样
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));
由Dmytro Rudenko发布
答案 1 :(得分:0)
尝试
decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity")??0);
答案 2 :(得分:0)
你可以先解析Field,然后求它:
decimal val = dataRow.AsEnumerable()
.Select(s => s.Field<decimal?>("Quantity"))
.Where(s => s != null)
.Sum(s => s) ?? 0.0m;
请注意我使用了十进制?,因此代码实际上可以处理空值。我还使用了coalesce运算符,因为当枚举为空时Sum将返回null。
答案 3 :(得分:0)
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));
答案 4 :(得分:0)
你可以试试这个:
decimal val = dataRow.AsEnumerable().Sum(s =>
{
var field = s.Field<object>("Quantity");
return field == null ? 0 : (decimal) field;
});
但最简单的方法是允许小数可以为空
decimal val = dataRow.AsEnumerable().Sum(s => s.Field<decimal?>("Quantity") ?? 0);
答案 5 :(得分:0)
根据Enumerable.Sum<Nullable<decimal>>
的{{3}},
如果 source 不包含任何元素,则此方法返回零。
结果不包含 null 的值。
因此,似乎人们使用的所有空检查,煤炭和条件都是不必要的,而且你需要的只是
decimal val = dataRow.AsEnumerable()
.Sum(s=>s.Field<decimal?>("Quantity"))
.Value;