错误:转换为值类型“Double”失败,因为实现值为null

时间:2013-08-17 16:04:29

标签: c# linq entity-framework

我有一个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。   结果类型的通用参数或   查询必须使用可空类型。

6 个答案:

答案 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 
 }

如果starint,则您不需要&& 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;