转换为值类型“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)
这应该可以解决问题(如果Quantity
或Price
不可为空,您可能必须删除其中一个条件):
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”将得到解决谢谢