如何使lambda查询可以为空?

时间:2014-04-24 17:28:14

标签: c# lambda

我收到以下错误:

  

转换为值类型'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);

5 个答案:

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