2016-03-23 9 views
0

なぜこれがキャストに失敗しているのか分かりません。それはそれがnullだと言いますが、それはnullであるかどうかをチェックしているので、それは決して0ではないでしょうか?二重失敗にキャストしますか?

 var BF = (double)filtered.Sum(s => s.fees 
      .Where(w => w.status == "B") 
      .Sum(su => su.amount ?? 0)); 

ERR:The cast to value type 'System.Decimal' failed because the materialized value is null. Either the result type's generic parameter or the query must use a nullable type.

私は、それぞれがNULL可能で、小数点amountが含まれていると私はちょうど金額を合計する必要がfeesのリストが含まれているオブジェクトのリストを持っています。私は何が欠けていますか?

+1

試してください:.Sum(su => su.amount ?? 0D)); – Kevin

+0

申し訳ありませんが、私はそれが小数であったことを忘れていました。 –

+1

そのエラーを検索しようとしましたか?この暗黙の例外では、 'Sum()'(またはクエリ結果から要求された型の変数へのマテリアライゼーション)が失敗する行はありません。 – CodeCaster

答えて

1

.Sum()は空のセットで行われたときにnullを返すので、このシナリオではnullが発生しないように、.DefaultIfEmpty(0)を使用することをお勧めします。

セットを制限するために、nullを除外することもお勧めします。

var BF = (double)filtered.Sum(s => s.fees 
     .Where(w => w.status == "B" && w.amount != null) 
     .Select(su => su.amount) 
     .DefaultIfEmpty(0) 
     .Sum()); 
+0

私はうまくいくとは思わない。このLINQはSQLに変換され、応答は 'decimal'に戻ります。後者の部分は行が存在しないため失敗しています。 – CodeCaster

+0

@CodeCaster - 空のセットを合計すると0が返されます。私は、行がない場合(行がない場合)、ここで役割を果たしているとは思わない。 –

+1

'SELECT SUM(f)WHERE 1 = 0'は' NULL'を返します。それは要求された非ヌル値の 'decimal'に変換できない' NULL'です。 – CodeCaster

0

これ試してみてください。

var BF = (double)filtered.Sum(s => s.fees.Where(w => w.status == "B").Sum(su => su.amount ?? 0) ?? 0); 

たぶん内部ラムダ「s.fees.Where(ワット=> w.status == "B")和(SU => su.amountを? ?0) "return null

関連する問題