我尝试在下面的代码中使用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 |
---------------- ----------- ---------
知道如何解决这个问题吗?
答案 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)