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

时间:2015-02-01 17:19:42

标签: c# lambda

如果没有与以下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);

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

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

1 个答案:

答案 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;