2011-12-29 7 views
7

Mam zapytanie:LINQ suma i zerowy

var qq = (from c in db.tblArcadeGames 
     where 
      c.IsDeleted == false && 
      c.ParentGameID == 0 && 
      c.Approved == true 
     let aggPlays = c.Plays + db.tblArcadeGames.Where(v => v.ParentGameID == c.ID).Sum(v => (int?)v.Plays) 
     orderby aggPlays descending 
     select new { c, aggPlays }) 
     .Skip(Skip) 
     .Take(Fetch); 

foreach (var g in qq) 
{ 
    HttpContext.Current.Response.Write("{" + g.aggPlays + "}\n"); 
} 

Kiedy wydrukować aggPlays w pętli powyżej wyjdą jako:

{21} 
{} 
{} 
{} 

Problem wydaje się, że Sum() powraca null jeśli nie istnieją żadne zapisy. Nie jestem pewien, jak to obejść, aby c.Plays + null nie równa się null, ale tylko c.Plays.

Odpowiedz

16

Można to skorygować przez nie wraca int?, ale raczej konwertować do int bezpośrednio:

.Sum(v => v.Plays ?? 0) 
+0

Thanks to działa! Dlaczego jest sumą pustego zestawu zerowego w linq do sql? Suma pustego zestawu powinna wynosić 0 w prawo? –

+1

@TomGullen * "' Sum() 'zawsze zwraca 0 dla pustej sekwencji w zwykłym LINQ, wydaje się, że jest to raczej LINQ do niedoboru SQL, a nawet wtedy powinno być możliwe tylko wtedy, gdy sumowane wartości same są zerowe (ponieważ w przeciwnym razie zwracany typ Sum byłby zwykły * "dziesiętny' *, a nie *" dziesiętny? '*)." * Z http://connect.microsoft.com/VisualStudio/feedback/details/360365/linq-sum- metoda-wartość-zwrotu – Rob

+0

@robjb żadna z kolumn nie jest null, czy jest to błąd w linq do sql, to? –

1
int response = 
    (from p in data.tbHoraires 
    where p.eid == eid && p.annee == annee && p.obligatoire == true 
    select (int?)p.nbminute ?? 0).Sum();