2009-03-13 20 views
25

mam coś takiego:LINQ do SQL .Sum (...) bez grupy do

var itemsInCart = from o in db.OrderLineItems 
        where o.OrderId == currentOrder.OrderId 
        select new { o.OrderLineItemId, ..., ..., o.WishListItem.Price} 

jest jakiś sposób, aby zrobić

itemsCart.Sum() //not sure what to pass into the function 

aby uzyskać sumę o. WishListItem.Price czy muszę pobrać inny plik iQueryable < T> z bazy danych z grupą ... do?

Odpowiedz

52

Co o:

itemsInCart.AsEnumerable().Sum(o=>o.Price); 

AsEnumerable robi różnicę, to zapytanie wykona lokalnie (LINQ to Objects).

+0

który jest jeszcze lepszy, thanx –

15

można:

itemsCart.Select (C => c.Price) .Sum();

Aby trafić db tylko raz zrobić:

var itemsInCart = (from o in db.OrderLineItems 
        where o.OrderId == currentOrder.OrderId 
        select new { o.OrderLineItemId, ..., ..., o.WishListItem.Price} 
       ).ToList(); 
var sum = itemsCart.Select(c=>c.Price).Sum(); 

Dodatkowy obie zapisane warto :)

+0

Nie można przetłumaczyć wyrażenia "(...). Wybierz (o => o.Price). Sum()" do SQL i nie może traktować go jako wyrażenie lokalne. –

+0

Wypróbuj itemsCard.ToList(). Wybierz (c => c.Price) .Sum(); –

+0

@rm jeśli otrzymujesz informacje mimo to, rób tak, jak wspomniał Jonathan (zapisz listę na zmiennej, więc otrzymasz dane tylko raz). – eglasius

7

Spróbuj:

itemsCard.ToList().Select(c=>c.Price).Sum(); 

Faktycznie byłoby to lepsze wyniki:

var itemsInCart = from o in db.OrderLineItems 
       where o.OrderId == currentOrder.OrderId 
       select new { o.WishListItem.Price }; 
var sum = itemsCard.ToList().Select(c=>c.Price).Sum(); 

Ponieważ będziesz pobierać tylko jedną kolumnę z bazy danych.

+0

otrzymujesz +1 :) –

+0

Potrzebuję innych kolumn do innych rzeczy, to jest powód, dla którego nie chciałem uzyskać kolejnego IQueryable < T> od DB –

1

Spróbuj tego:

var itemsInCart = from o in db.OrderLineItems 
       where o.OrderId == currentOrder.OrderId 
       select o.WishListItem.Price; 

return (Convert.ToDecimal(itemsInCart.Sum())); 

myślę, że to bardziej proste!

Na razie.

1

wiem, że to jest stare pytanie, ale dlaczego nie można zrobić tak:

db.OrderLineItems.Where(o => o.OrderId == currentOrder.OrderId).Sum(o => o.WishListItem.Price); 

nie jestem pewien jak to zrobić za pomocą wyrażeń zapytań.

+0

będzie to błąd nullreference If nie znaleziono wierszy, więc musisz użyć .AsEnumerable(). Sum (o => o.Price) –

+0

@EugeneBosikov Jak zauważono w innych odpowiedziach, dodanie 'AsEnumerable' spowoduje, że LINQ odzyska cały zestaw danych z serwera i agregować je lokalnie, co jest znacznie mniej wydajne niż wykonanie bazy danych przez bazę danych.Poza tym sposób działania LINQ nie powoduje wystąpienia błędu referencyjnego o wartości zerowej, ponieważ buduje ścieżkę wykonania i faktycznie nie wykonuje żadnej pracy, dopóki wyniki nie zostaną przesłane do nowej kolekcji. – Trisped