LINQ:失败,因为具体化值为null

时间:2017-01-03 08:26:39

标签: c# linq

我尝试在下面的代码中使用sum但是我收到错误:

  

演员价值类型' System.Int32'失败,因为物化   value为null。结果类型的通用参数或查询   必须使用可空类型。

Product_Order:
    ---------------- ----------- ---------
    |   ProductId   | OrderId   | Quantity |
    ---------------- ----------- ---------

我在" let quantity"

收到错误
  var fullInfo = (from product in allProdcts
                 let quantity = db.Product_Order.Where(x=> x.ProductId == product.ID).Sum(x => x.Quantity)
                select new ReportVm
                    {                          
                        ProductId = product.ID,
                        ProductName = product.Name,
                        AmountProduct = quantity,
                        TotPrice = (quantity)*(product.Price)
                    }).ToList();

这是我的Product_Order表(M-M关系):

Product_Order:
    ---------------- ----------- ---------
    |   ProductId   | OrderId   | Quantity |
    ---------------- ----------- ---------

知道如何解决这个问题吗?

3 个答案:

答案 0 :(得分:9)

您需要允许可以为空的Quantity,您可以使用??表达式来实现它,并在使用int?时强制转换为Sum()

.Sum(x => (int?)x.Quantity)??0

您的查询应该是

var fullInfo = (from product in allProdcts
            let quantity = db.Product_Order.Where(x => x.ProductId == product.ID).Sum(x => (int?)x.Quantity)??0
            select new ReportVm
            {
                ProductId = product.ID,
                ProductName = product.Name,
                AmountProduct = quantity,
                TotPrice = (quantity)*(product.Price)
            }).ToList();

答案 1 :(得分:1)

您不能使用在空集合上返回非可空类型的聚合函数。在您的情况下,当db.Product_Order上的where子句不返回任何元素时,Sum()失败。在解决方案中,将0定义为默认值,应该可以工作:

var fullInfo = (from product in allProdcts
                let productOrder = db.Product_Order.Where(x => x.ProductId == product.ID)
                let quantity = productOrder.Any() ? productOrder.Sum(x => x.Quantity) : 0
                select new ReportVm
                {
                    ProductId = product.ID,
                    ProductName = product.Name,
                    AmountProduct = quantity,
                    TotPrice = (quantity) * (product.Price)
                }).ToList();

答案 2 :(得分:0)

另一种解决方案...

let quantity = db.Product_Order.Where(x=> x.ProductId == product.ID).Sum(x => x.Quantity == null ? 0 : x.Quantity)