转换为值类型“Double”失败,因为具体化值为null

码:

double cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged  x.Quantity * x.Price); 

错误:

转换为值类型“Double”失败,因为具体化值为null。 结果类型的generics参数或查询必须使用可空类型。

我已经看到了什么:

转换为值类型“Int32”失败,因为具体化值为null

转换为值类型’Decimal’失败,因为具体化值为null

我做了什么:

 double cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged  x.Quantity * x.Price); 

和:

 double? cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged  x.Quantity * x.Price); 

这些都不奏效。 我知道问题的原因是该表中没有我传入的UserId中的行。在这种情况下,我希望Sum()只返回0给我。 有任何想法吗?

最佳方案

 double cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged <= dateEnd) .Sum(x => (double?)(x.Quantity * x.Price)) ?? 0; 

您可以检查集合是否有正确的结果。

 double? cafeSales = null; var invoices = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged <= dateEnd ) .Where(x => x.Quantity != null && x.Price != null); if (invoices.Any()) { cafeSales = invoices.Sum(x => x.Quantity * x.Price); } 

我知道这有点旧,但万一它可以帮助任何人。

@Matt我想DefaultIFEmpty()方法应该适用于你,以防你为要应用Sum的列传递一个默认值。 这种方法有一些你可能需要检查的重载,如果重载不支持你的要求,我建议使用类型转换。

  (query).DefaultIfEmpty(0) 

这应该可以解决问题(如果QuantityPrice不可为空,您可能必须删除其中一个条件):

 var cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged <= dateEnd && x.Quantity != null && x.Price != null); double cafeSalesTotal = 0; if (cafeSales.Any()) { cafeSalesTotal = cafeSales.Sum(x => x.Quantity * x.Price); } 
  var cafeSales = db.InvoiceLines .Where(x => x.UserId == user.UserId && x.DateCharged >= dateStart && x.DateCharged <= dateEnd) .Sum(x => x.Quantity * x.Price); double i; if(cafeSales==null) ? i=0 : i=(double)cafeSales.First(); 

上面的解决方案对我不起作用。 我的问题很相似。 我确信没有返回任何行,但Sum表现得很奇怪。 所以我决定在调用lambda表达式之前添加一个检查,我检查lambda返回的行的count属性。 如果它大于零,那么我调用sum表达式。 这对我有用。

 join sim in ctx.EF.Collaterals on new { id = ini.cam.id, Type = 0 } equals new { id = sim.CampaignId == null ? new Guid() : sim.CampaignId, sim.Type } into tempcoll from sim in tempcoll.DefaultIfEmpty() 

这个解决方案有效。实际上你需要使用三元运算符来检查值,并在第二列和第二个表中插入Guid if null。它将起作用。 “转换为值类型’Double’失败,因为物化值为null”将得到解决谢谢