2017-01-03 64 views
1

我想在下面的代码使用的总和,但我得到的错误:LINQ:失败,因为物化值为null

The cast to value type 'System.Int32' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

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表(MM关系):

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

任何想法如何解决这个问题?

+0

请将'Product_Order'自动生成的POCO类添加到您的问题中。如何定义'Quantity'属性很重要('int'或'int?'), – Sefe

+0

@M.Wiśnicki正如我理解的那样,如果代码为空,代码会给出值0? – fagol

+0

@M.Wiśnicki我使用该代码得到相同的错误。但只是加入'(int?)'没有'??'没有任何错误(但我仍然需要值为0,如果为空)。编辑:'??'不会与这段代码一起工作,我在尝试这个问题之前就试过了。但它在该代码之外工作。其他解决方案? – fagol

回答

4

您需要允许空值为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(); 
+0

如果'Quantity'是'int',将其转换为'int?'不会改变和弦,并且如果是'int?'类型,则不需要转换。 – Sefe

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(); 
相关问题