2013-04-26 21 views
5

Mam IQueryable z NHibernate i chciałbym mieć zapytanie linq, aby zsumować określoną kolumnę, ale gdy mój stan na metodzie Where daje mi pusty wynik nie chcę, aby uzyskać wyjątek, ale nie chciałbym trafić kwerendy, aby uzyskać wszystkie rekordy i po to podsumować w pamięci, chciałbym coś takiego coalese polecenia sQL, dla próbki:Nie otrzymuje wyjątku, gdy kolekcja jest pusta przy użyciu metody Sum i Nhibernate

// I get exception when its empty 
var query = MyQueryable() 
       .Where(x => x.IsDone) 
       .Select(x => x.Value) 
       .Sum(); 

mam zrobić coś takiego:

// I get 0, its ok, but ToList(), list all records on memory, 
// I just want to get a single value 

var query = MyQueryable() 
       .Where(x => x.IsDone) 
       .Select(x => x.Value) 
       .ToList() 
       .Sum(); 

Czy jest jakiś sposób?

Dziękuję.

+0

Co z warunkiem if przy użyciu operatora Any? – gustavodidomenico

+0

Czy próbowałeś 'DefaultIfEmpty'? – I4V

+0

Linq NHibernate nie obsługuje 'DefaultIfEmpty' :( –

Odpowiedz

7

Musisz odrzucić Value do typu zerowego.

Na przykład, zakładając Value jest int nieruchomości:

var result = MyQueryable() 
       .Where(x => x.IsDone) 
       .Select(x => (int?)x.Value) 
       .Sum() 
      ?? 0; 

Ponieważ Sum() na pustych przeliczalny zwróci null dla pusty źródła, operator COALESCE (??) dba o powrocie 0, kiedy to się stanie .

Powiązane problemy