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

6
如果没有符合以下lambda查询的记录,我会得到一个System.InvalidOperationException错误。其他信息:转换为值类型“System.Decimal”失败,因为实体化值为空。结果类型的泛型参数或查询必须使用可空类型。
代码是:runTime = db.Records.Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x).Sum(c => c.RunMinutes); 变量runTime是一个decimal。我试过将其更改为decimal?,但仍然收到相同的错误。
解决这个问题的正确方法是什么?
1个回答

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类型的默认值为0.0M(默认值表) 此外:
您并没有告诉我们你正在使用哪个? 但是,如果您正在使用LinqToEntity,则必须更改您的代码(因为EF不支持DefaultIfEmpty):
runTime = db.Records
              .Where(c => c.MachineDesc.Contains(strMachine) && c.ProductionDate == dt && c.Shift == x)
              .Sum(c => (decimal?)c.RunMinutes) ?? 0;

@BillGreer,您能告诉我们出了什么错误吗? - Farhad Jabiyev
@BillGreer 请问您正在使用哪种 Linq?Linq to Entity、Linq to Sql 还是 Linq to Objects? - Farhad Jabiyev
Linq to Entity。我得到了一个编译错误:'System.Linq.IQueryable<Record>'不包含'DefaultIfEmpty'的定义。我该如何添加'DefaultIfEmpty'的定义? - Bill Greer

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接