2011-11-03 9 views
6

ho la seguente queryLINQ to SQL con somma lambda come condizione WHERE

from p in _context.Products 
where p.Purchases.Sum(item => item.CCAmount) > 0 && p.Purchases.Sum(item => item.CCAmount) > p.PayOuts.Sum((item => item.AmountPaid) 
select p; 

Fondamentalmente sto cercando di recuperare tutti i prodotti che hanno un importo di acquisto riassunto maggiore di 0 e il cui importo di acquisto riassunto è maggiore di l'importo che abbiamo pagato (stiamo vendendo prodotti per conto di altre persone e li paghiamo in pagamenti completi o parziali). Il problema è che se non ci sono voci nella tabella dei pagamenti per un particolare prodotto, quel prodotto non appare nell'elenco risultante. Tuttavia, se inserisco un pagamento nella tabella dei pagamenti, quel prodotto apparirà nell'elenco dei prodotti. E 'quasi come se usare la somma su una collezione vuota non valesse come ci si aspetterebbe che fosse 0. Come mi manca qualcosa qui?

Grazie per il vostro aiuto.

+0

Qual è la SQL generato? – svick

risposta

5

Il problema è che SUM in SQL restituisce null se non ci sono record da sommare.

È necessario imbrogliare un po '.

Prova:

((int?)p.PayOuts.Sum(item => item.AmountPaid)).GetValueOrDefault() 

o scritta in un po 'diverso modo

((int?)p.PayOuts.Sum(item => item.AmountPaid) ?? 0) 
+0

+1; Ma penso che avresti ancora bisogno del cast per il secondo caso per rendere felice l'esterno C# ...? –

+0

@ MerlynMorgan-Graham, hai ragione. –

+0

Grazie per l'aiuto, funziona perfettamente. – Peuge