我收到以下错误:
转换为值类型'System.Int32'失败,因为已实现 value为null。结果类型的泛型参数或查询 必须使用可空类型。
如何让我的lambda表达式成为可空?
d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen);
更新:以下代码有效。有人能告诉我为什么Linq表达式有效而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);
答案 0 :(得分:4)
我喜欢@ RezaRahmati的建议,但另一种选择是:
d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS && d.QtyOpen.HasValue)
.Sum(c => c.QtyOpen);
如果所有QtyOpen
都为空,那么您将对一个空列表求和,这将给出零。
然而,我喜欢Reza的答案是,如果总和为空,它会更明确地将结果设置为零。
答案 1 :(得分:2)
我认为问题是QtyOnOrder
,因为Sum
可以返回null QtyOnOrder
应该可以为空或使用以下语法:
d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen) ?? 0;
答案 2 :(得分:1)
我也需要施放,例如以下内容;
d.QtyOnOrder = db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS)
.Sum(c => (int?)c.QtyOpen) ?? 0;
答案 3 :(得分:0)
错误表明d.QtyOnOrder
不可为空,因此解决方案是更改类定义,使其为int?
(Nullable<int>
的简写)或使用空合并左侧的运算符,以确保永远不会返回null;
db.DieOrders.Where(c=>c.DrawDie.SizeUS==d.SizeUS).Sum(c => c.QtyOpen) ?? 0;
答案 4 :(得分:0)
如果“QtyOnOrder”的数据类型为 int ,则应将其设为 int?。所以现在即使sum返回null,代码也不会产生任何错误。
int?是可以为空的数据类型。要了解Nullable类型,请访问Nullable Types。