我有一个star_tbl。我想在我的网站上制作星球。 我的鳕鱼:
public int StarProduct(int id_Product)
{
return Convert.ToInt32(db
.tbl_satar_Product
.Where(p => p.Id_Product == id_Product && p.star != null)
.Average(s => s.star));
}
但 t显示此错误:
转换为值类型“Double”失败,因为具体化值为null。 结果类型的通用参数或 查询必须使用可空类型。
答案 0 :(得分:1)
听起来我的数据库与您的模型定义不一致。也就是说,您已经以与数据库实际定义不同的方式定义了模型。
特别是,听起来像star可能是数据库中可以为空的int,但是你已经将它定义为模型中的int。您需要更改数据库,或更改模型以更正此问题。
如果star不是可以为空的int,那么你的p.star!= null语句是没有意义的,因为除非你的数据库定义不同,否则star不可能为null。
答案 1 :(得分:0)
那怎么样?
public int StarProduct(int id_Product)
{
return Convert.ToInt32(db
.tbl_satar_Product
.Where(p => p.Id_Product == id_Product && p.star.HasValue)
.Average(s => s.star.Value));
}
答案 2 :(得分:0)
似乎Average部分返回null(作为无法转换为int的double。解决方案:
int?
将方法拆分为单独的组件,然后可以单独调试:
var items = Convert.ToInt32(db.tbl_satar_Product.Where(p => p.Id_Product == id_Product && p.star.HasValue
)
然后
return ((int)items.Average(s => s.star)) ?? 0
然后,您可以单独检查每个组件。
答案 3 :(得分:0)
我想你有一个类似的类:
class TblSatarProduct
{
public int Id_Product {get;set;}
public int star {get;set;}
}
tbl_satar_Product
就是这样的一个例子。现在,您可以在方法public int StarProduct(int id_Product)
中执行此操作:
首先获取列表(IEnumerable
):
var list = db
.tbl_satar_Product
.Where(p => p.Id_Product == id_Product)
if (list == null)
{
return 0; // or default value
}
如果star
为int
,则您不需要&& p.star != null
,如果您需要检查star
是否有值,可能需要将其更改为{{ 1}}在这种情况下,您可以使用int?
。
然后,你得到平均值:
!= null
也许在这一点上,您可以返回 double average = list.Average(s => s.star);
if (average == null)
{
return 0; // or default value
}
类型,然后调用方法double
的人必须负责转换。
最后:
StarProduct
信息
Enumerable.Average (Método) (IEnumerable)
Casting and Type Conversions (C# Programming Guide)
答案 4 :(得分:0)
我认为您的查询中有0条记录,这就是您无法执行平均值的原因。
答案 5 :(得分:0)
空字段: 如果计算中的字段可为空,则无需执行任何特殊操作。只需按原样使用平均值,如下所示:
var avg = expression.Average(x => x.Star);
此处,平均值为可为空(int?)。如果将其设置为不可为空,则使用 null合并运算符 ,并设置默认值0(零),如下所示:
var avg = expression.Average(x => x.Star) ?? 0;
不可为空字段: 但是,如果计算中的字段不可为空,那么您需要首先将可为空的字段强制转换为平均值,如下所示:
var avg = expression.Average(x => (int?)x.Star);
在这里,平均值是可为空的(两倍?)。如果将其设置为不可为空,则使用 null合并运算符 ,如下所示:
var avg = expression.Average(x => (int?)x.Star)?? 0;