如何检查我的lambda表达式为null?

如果没有匹配以下lambda查询的记录,我会得到一个

System.InvalidOperationException错误。 附加信息:转换为值类型’System.Decimal’失败,因为具体化值为null。 结果类型的generics参数或查询必须使用可空类型。

代码是: runTime = db.Records.Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x).Sum(c => c.RunMinutes);

变量runTimedecimal 。 我尝试将其更改为decimal? 但我仍然得到同样的错误。

解决这个问题的正确方法是什么?

首先,您可以从满足条件的对象中选择十进制值。 然后在.Sum()方法之前使用.DefaultIfEmpty() .Sum()方法:

 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 。 (默认值表)

另外

你没告诉我们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;