如何使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);
我喜欢@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。