2011-12-29 13 views
7

ho la query:Linq somma e nulla

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"); 
} 

Quando stampo fuori aggPlays nel ciclo sopra vengono fuori come:

{21} 
{} 
{} 
{} 

Il problema sembra essere che i Sum() rendimenti null se nessun record esiste. Non sono sicuro di come aggirare questo in modo che c.Plays + null non sia uguale a null ma solo a c.Plays.

risposta

16

È possibile correggere questo non restituendo int?, ma piuttosto convertire in int direttamente:

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

Grazie questo funziona! Perché la somma di un insieme vuoto è null sebbene in linq a sql? Una somma di un set vuoto dovrebbe essere 0 giusto? –

+1

@TomGullen * "' Sum() 'restituisce sempre 0 per una sequenza vuota in LINQ semplice, sembra che sia piuttosto un difetto LINQ to SQL, e anche in questo caso dovrebbe essere possibile solo se i valori che si sommano sono annullabili (perché altrimenti il ​​tipo di ritorno di Sum sarebbe semplice * 'decimale' *, non *' decimale? '*)." * Da http://connect.microsoft.com/VisualStudio/feedback/details/360365/linq-sum- metodo-valore di ritorno – Rob

+0

@robjb nessuna delle colonne è nullable, si tratta di un bug in linq a sql allora? –

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