如果没有匹配以下lambda查询的记录,我会得到一个
System.InvalidOperationException error. Additional information: The cast to value type ‘System.Decimal’ Failed because the materialized value is null. Either the result type’s generic parameter or the query must use a nullable type.
代码是:runTime = db.Records.Where(c => c.MachineDesc.Contains(strMachine)&& c.ProductionDate == dt&& c.Shift == x).Sum(c = > c.RunMinutes);
变量runTime是小数.我尝试将其更改为小数?但我仍然得到同样的错误.
解决方法
首先,您可以从满足条件的对象中选择十进制值.然后在.Sum()方法之前使用
.DefaultIfEmpty()
方法:
runTime = db.Records .Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x) .Select(c => c.RunMinutes) .DefaultIfEmpty() .Sum();
如果序列为空,则DefaultIfEmpty()函数会插入具有默认值的单个元素.而且我们知道,十进制类型的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;