如果没有与以下lambda查询匹配的记录,我会得到一个
System.InvalidOperationException错误。附加信息:转换为值类型'System.Decimal'失败,因为具体化值为null。结果类型的泛型参数或查询必须使用可空类型。
代码为:runTime = db.Records.Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x).Sum(c => c.RunMinutes);
变量runTime
是decimal
。我尝试将其更改为decimal?
,但我仍然遇到同样的错误。
解决此问题的正确方法是什么?
答案 0 :(得分:23)
首先,您可以从满足条件的对象中选择十进制值。然后在.Sum()
方法之前使用.DefaultIfEmpty()
方法:
runTime = db.Records
.Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x)
.Select(c => c.RunMinutes)
.DefaultIfEmpty()
.Sum();
如果序列为空, DefaultIfEmpty()
函数会插入一个具有默认值的元素。我们知道,decimal
类型的defualt值为0.0M
。
(Default Values Table)
<强> 另外 强>:
您没有告诉我们 Linq ?您使用的是什么?但是,如果您使用的是LinqToEntity,则必须更改代码,因为(EF不支持DefaultIfEmpty
):
runTime = db.Records
.Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x)
.Sum(c => (decimal?)c.RunMinutes) ?? 0;