LINQ:由于实例化值为空而失败。

10
我试图在下面的代码中使用sum,但是出现了以下错误:
“将实体化值转换为值类型'System.Int32'时失败,因为该值为空。结果类型的泛型参数或查询必须使用可空类型。”
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 |
    ---------------- ----------- ---------

有什么办法解决这个问题吗?

请在您的问题中添加自动生成的 Product_Order POCO 类。重要的是要定义 Quantity 属性(int 还是 int?)。 - Sefe
@M.Wiśnicki,如果我理解正确的话,这段代码会在值为空时返回0吗? - fagol
@M.Wiśnicki 我使用此代码仍然遇到相同的错误。但是只需添加(int?)而不需要??,即可在没有出现任何错误的情况下解决问题(但如果为null,则仍需要值0)。编辑:??无法与此代码一起使用,我在提问之前尝试了它。但在该代码外部可以正常工作。还有其他解决方案吗? - fagol
3个回答

19

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

.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();

如果 Quantityint,将其转换为 int? 不会改变任何内容,如果它是 int? 类型,则不需要进行转换。 - Sefe
不是这样的@Sefe-我刚刚尝试了一下使用“decimal”,如果我没有转换为“decimal?”,则会出现错误-它正在对“null”进行求和,并且没有逻辑来知道它将传递给该结果“null”的内容。 - d219

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();

0

另一种解决方案...

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接