如何使lambda查询可以为null

本文关键字:null 查询 何使 lambda | 更新日期: 2023-09-27 18:00:02

我得到以下错误:

转换为值类型"System.Int32"失败,因为具体化了值为null。结果类型的泛型参数或查询必须使用可为null的类型。

如何使lambda表达式为null?

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen);

更新:下面的代码有效。有人能告诉我为什么林克的表情有效,而Lambda却无效吗?

            var dies = from e in db.DieOrders
                          where e.DrawDieID == d.ID && e.QtyOpen !=null
                          select e;

            var _qtyOpen = dies.Sum(x => x.QtyOpen);

如何使lambda查询可以为null

我喜欢@RezaRahmati的建议,但另一种选择是:

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS && d.QtyOpen.HasValue)
    .Sum(c => c.QtyOpen);

如果所有的QtyOpen都为空,那么您正在对一个空列表求和,该列表将为零。

然而,我喜欢Reza的答案的地方在于,它更明确地表明,如果总和为零,则将结果设置为零。

我认为问题出在QtyOnOrder上,因为Sum可以返回null QtyOnOrder应该可以为null或使用以下语法:

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen) ?? 0;

我也需要进行强制转换,例如:;

d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS)
.Sum(c => (int?)c.QtyOpen) ?? 0;

错误表示d.QtyOnOrder不可为null,因此解决方案是更改类定义,使其成为int?Nullable<int>的缩写),或者使用左侧的null合并运算符来确保永远不会返回null;

db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen) ?? 0;

如果"QtyOnOrder"的数据类型为int,则应将其设置为int。所以现在即使sum返回null,代码也不会生成任何错误。

int是一个可以为null的数据类型。要了解Nullable类型,请访问Nullable types。