2009-03-13 17 views
25

ho qualcosa di simile a questo:LINQ to SQL .sum() senza ... in

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

esiste un modo per fare un

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

per ottenere la somma di o. WishListItem.Prezzo o devo ottenere un altro iQueryable < T> dal database con gruppo ... in?

risposta

52

Che dire:

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

AsEnumerable fa la differenza, questa query eseguirà localmente (LINQ to Objects).

+0

che è ancora meglio, grazie –

15

è possibile:

itemsCart.Select (c => c.Price) .sum();

Per colpire il db solo una volta fare:

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(); 

Il round-trip aggiuntivo salvato vale la pena :)

+0

Impossibile tradurre espressione '(...). Selezionare (o => o.Price) .Sum()' in SQL e non è possibile trattarlo come espressione locale. –

+0

Provare articoliCard.ToList(). Selezionare (c => c.Prezzo) .Sum(); –

+0

@rm se si ottengono comunque le informazioni, fare come ha detto Jonathan (salvare l'elenco su una variabile, in modo da ottenere i dati una volta sola). – eglasius

7

Prova:

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

In realtà questo sarebbe un rendimento migliore:

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(); 

Perché recupererai solo una colonna dal database.

+0

si ottiene per mantenere +1 :) –

+0

Ho bisogno di altre colonne per altre cose, questo è l'intero motivo non volevo ottenere un altro IQueryable < T> dal DB –

1

Prova questo:

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

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

Penso che sia più semplice!

Per ora.

1

So che questa è una vecchia questione, ma perché non si può fare così:

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

io non sono sicuro di come fare questo usando espressioni di query.

+0

sarà errore di riferimento null Se nessuna riga trovata, quindi devi usare .AsEnumerable(). Sum (o => o.Prezzo) –

+0

@EugeneBosikov Come è stato notato in altre risposte, l'aggiunta di 'AsEnumerable' causerà a LINQ il recupero dell'intero set di dati dal server e aggregarlo localmente, che è molto meno efficiente di fare il lavoro con il database.Inoltre, il modo in cui LINQ funziona non ti consente di ottenere un errore di riferimento nullo perché sta creando un percorso di esecuzione e in realtà non funziona finché non generi i risultati in una nuova raccolta. – Trisped