Zobacz wyniki ankiety na temat zarobków programistów w Polsce. Czytaj więcej..
1

Zapytanie linq sumuje wartości zamówień dla kontrahenta

(from ord in db.Orders where ord.Clent_Id == client.Id select o.Value).Sum()

działa dobrze dopóki nie trafi się kontrahent bez zamówień - wtedy wyrzuca wyjątek.
Czy da się to jakoś obejść?

flag
jaki wyjątek? coś w rodzaju null reference? Niech Value istnieje zawsze. – nilphilus Apr 21 at 17:30
precyzyjnie: samo zapytanie nie wyrzuca wyjątku, dopiero okno podczas wyświetlania struktury, treść wyjątku zupełnie bez sensu: "Nie można utworzyć wystąpienia „WinMain” zdefiniowanego w zestawie „WpfA, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null”. Obiekt docelowy wywołania zgłosił wyjątek. Błąd w pliku znaczników „WMain.xaml” wiersz 1 pozycja 9." – Wiewiurczak Apr 21 at 17:41
@Wiewiurczak: Jak zerkniesz w okienko Output to tam będzie ten wyjątek napisany explicite. Zapewne używasz DataBindingu a on 'połyka' wyjątki. – Paweł Łukasik Apr 21 at 18:00
Tak używam DataBindingu. Może tak: "Nie można przypisać wartości zerowej do członka typu System.Decimal, który jest członkiem typu wartość niezerowalna." – Wiewiurczak Apr 21 at 18:13

3 Answers

0

A może tak?

var result = (from ord in db.Orders where ord.Clent_Id == client.Id select o.Value);
int sum = (result.Any()) ? result.Sum(v => v) : 0;
link|flag
tylko tutaj jest wynik zapytania dla jednego klienta, a ja potrzebuje kolekcje dla wszystkich klientów – Wiewiurczak Apr 21 at 17:49
A jednak właśnie tak się udało :), dzięki. – Wiewiurczak Apr 23 at 13:11
3

Operacja sumowania nie może być przeprowadzona na pustym zbiorze. Pomaga następująca konstrukcja:

(from ord in db.Orders where ord.Clent_Id == client.Id select o.Value)
    .DefaultIfEmpty(0).Sum();
link|flag
nadal jest problem, kompilator wypluwa: "Użyto nieobsługiwanego przepełnienia dla operatora kwerendy „DefaultIfEmpty”." – Wiewiurczak Apr 22 at 10:38
Zdaje się, błąd powstaje w wyniku pobrania o.Value, gdyż właśnie Value jest właściwością już 'niezerowalną'. – dario-g Apr 22 at 11:37
0

Jedyne co przychodzi mi na myśl, to wrzucić to do bloku Try Catch i w bloku catch pod zmienną, do której zwracasz sumę podstawić 0. Rozwiązanie prymitywne ale powinno zadziałać.

link|flag
niestety nie da rady, wtedy cały obiekt mi się sypie – Wiewiurczak Apr 21 at 17:00

Your Answer

Not the answer you're looking for? Browse other questions tagged or ask your own question.