0

私は 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はこのエラーを示しています:

具体化された値が null であるため、値型「Double」へのキャストが失敗しました。結果の型のジェネリック パラメーターまたはクエリのいずれかで、null 許容型を使用する必要があります。

4

6 に答える 6

1

データベースがモデル定義と矛盾しているように思えます。つまり、データベースの実際の定義とは異なる方法でモデルを定義しています。

特に、star はデータベースでは nullable int のように聞こえますが、モデルでは int として定義しています。これを修正するには、データベースを変更するか、モデルを変更する必要があります。

p.star != null ステートメントは、データベースが別の方法で定義されていない限り、star が null になる可能性がないため、star が nullable int でない場合は意味がありません。

于 2013-08-17T19:53:02.007 に答える
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

その後、各コンポーネントを個別に確認できます。

于 2013-08-17T19:27:22.837 に答える
0

クエリのレコードが 0 であるため、平均を実行できないと思います。

于 2013-11-05T07:27:59.147 に答える
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

次のようなクラスがあるとします。

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 (メソッド) (IEnumerable)
キャストと型変換 (C# プログラミング ガイド)

于 2013-08-17T20:34:06.763 に答える