0

我有一个 star_tbl 。我想在我的网站上制作starpart。我的鳕鱼:

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。结果类型的泛型参数或查询必须使用可为空的类型。

4

6 回答 6

1

在我看来,您的数据库与您的模型定义不一致。也就是说,您以不同于数据库实际定义的方式定义了模型。

特别是,听起来 star 可能是数据库中的可为空的 int,但您已在模型中将其定义为 int。您需要更改数据库或更改模型以更正此问题。

如果 star 不是可为空的 int,则您的 p.star != null 语句没有意义,因为除非您的数据库定义不同,否则 star 不可能为 null。

于 2013-08-17T19:53:02.007 回答
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));
}
于 2013-08-17T17:52:59.560 回答
0

似乎 Average 部分返回 null(作为无法转换为 int 的双精度数。解决方案:

  • 将返回类型更改为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

然后,您可以分别检查每个组件。

于 2013-08-17T19:27:22.837 回答
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,也许你需要将它更改为int?在这种情况下你可以使用!= null

然后,你得到平均值:

 double average = list.Average(s => s.star);

 if (average == null)
 {
     return 0; // or default value 
 }

也许在这一点上,您可以返回double类型,然后由谁调用方法StarProduct将不得不处理转换。

最后:

try {
    int averageInt = Convert.ToInt32(average);
    return averageInt;
}
catch (OverflowException ex)  
{
    //outside the range of the Int32 type
    //check what do you do?
}   

Info
Enumerable.Average (Método) (IEnumerable)
类型转换和类型转换(C# 编程指南)

于 2013-08-17T20:34:06.763 回答
0

我想您的查询中有 0 条记录,这就是您无法执行平均的原因。

于 2013-11-05T07:27:59.147 回答
0

可空字段: 如果计算字段可以为空,则不需要做任何特别的事情。只需按原样使用平均值,如下所示:

var avg = expression.Average(x => x.Star);

在这里,平均值可以为空(int?)。如果您使它不可为空,则使用空合并运算符并设置默认值 0(零),如下所示:

var avg = expression.Average(x => x.Star) ?? 0;

Not Nullable Field: 但是,如果计算字段不是 nullable,那么您需要先将 nullable 转换为平均值,如下所示:

var avg = expression.Average(x => (int?)x.Star);

同样在这里,平均值可以为空(双倍?)。如果您使其不可为空,则使用空合并运算符,如下所示:

var avg = expression.Average(x => (int?)x.Star)?? 0;
于 2019-04-28T18:43:03.987 回答