2016-03-23 24 views
0

Bunun neden başarısız olduğunu anlayamıyorum. Null diyor, ama bu asla olmamalı çünkü ben sıfır olup olmadığını kontrol ediyorum ve 0 ile değiştiriyor, değil mi?Çift başarısızlığa mı atılıyor?

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

HATASI: 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.

ben her bir null ondalık amount içerirler ve sadece miktarlarını özetlemek gerekir fees bir listesini içerir nesnelerin bir listesi var. Neyi kaçırıyorum?

+1

Dene: .Sum (su => su.amount ?? 0D)); – Kevin

+0

Üzgünüm, ondalık olduğunu söylemeyi unuttum. –

+1

Bu hatayı aramayı denediniz mi? Bu şifreli istisna ile başarısız olmak için 'Sum()' (veya sorgu sonucundan istenen türden bir değişkene materyalizasyon) neden olan satır yoktur. – CodeCaster

cevap

1

.Sum()null boş bir kümede bittiğinde, bu senaryoda null karşılaşmadığından emin olmak için .DefaultIfEmpty(0) kullanmanızı öneririz.

Kümeyi sınırlamak için, boş değerleri filtrelemeyi de öneririm. .

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

Belki iç lambda "s.fees.Where (=> w.status w == "B") Sum (su => su.amount:

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

Bunun işe yaramayacağını düşünüyorum. Bu LINQ, SQL'e çevrilir ve yanıt, "ondalık" a dönüşür, ikinci bölüm başarısızdır, çünkü satır yoktur. – CodeCaster

+0

@CodeCaster - Boş bir kümeyi toplamlarsanız 0'a dönmelidir. Hiçbir satırın yönünün (eğer gerçekten satır yoksa) bir rol oynadığına inanmıyorum. –

+1

'SELECT SUM (f) 1 = 0 ',' NULL 'değerini döndürür. İstenen null olmayan "ondalık" lere geri çevrilemeyen "NULL". – CodeCaster

0

bu deneyin? "0)" dönüş null

İlgili konular