decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity"));
如果列包含 null,它会引发 Exception.so 我想返回零而不是异常
根据文档 http://msdn.microsoft.com/en-us/library/bb360891(v=vs.110).aspx数据集的字段扩展在值为 null 的情况下已返回 null,但它仅支持可为 null 的引用类型。它不支持像十进制这样的可为空的类型?它将在解析小数时引发异常。
因此,您必须手动检查字段的 DBNull,然后强制转换它。通常它会返回 DBNull,但扩展已经处理了。
因此,您可以像这样简单地在 linq 表达式中检查 Null
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));
正如德米特罗·鲁坚科发布的那样
尝试
decimal val=dataRow.AsEnumerable().Sum(s=>s.Field<decimal>("Quantity")??0);
您可以先解析字段,然后对其进行求和:
decimal val = dataRow.AsEnumerable()
.Select(s => s.Field<decimal?>("Quantity"))
.Where(s => s != null)
.Sum(s => s) ?? 0.0m;
请注意,我使用了十进制?,因此代码实际上可以处理空值。我还使用了合并运算符,因为当枚举为空时,Sum 将返回 null。
decimal val=dataRow.AsEnumerable().Sum(s=> s["Quantity"] == DBNull.Value ? 0M : s.Field<decimal>("Quantity"));
你可以试试这个:
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);
根据Enumerable.Sum<Nullable<decimal>>
的规范,
如果源不包含任何元素,则此方法返回零。
结果不包括空值。
因此,人们使用的所有空检查、合并和条件似乎都是不必要的,您所需要的只是
decimal val = dataRow.AsEnumerable()
.Sum(s=>s.Field<decimal?>("Quantity"))
.Value;