2009-03-13 18 views
25

ich so etwas wie dieses:Linq to SQL .sum() ohne Gruppe ... in

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

ist es eine Möglichkeit, eine

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

bekommen die Summe von o zu tun. WishListItem.Price oder muss ich einen anderen iQueryable < T> aus der Datenbank mit der Gruppe ... in?

Antwort

52

Was:

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

AsEnumerable den Unterschied macht, diese Abfrage lokal ausgeführt wird (Linq To Objects).

+0

, die noch besser ist, danke –

15

können Sie:

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

die db nur einmal getroffen zu tun:

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

Die zusätzliche Round-Trip gespeichert lohnt sich :)

+0

Ausdruck konnte nicht übersetzt werden (...). Wählen Sie (o => o.Price) .Sum() 'in SQL und konnte es nicht als lokalen Ausdruck behandeln. –

+0

Probieren Sie itemsCard.ToList(). Wählen Sie (c => c.Price) .Sum(); –

+0

@rm Wenn Sie die Informationen trotzdem bekommen, tun Sie wie Jonathan erwähnt (Speichern Sie die Liste auf einer Variablen, so dass Sie nur die Daten erhalten). – eglasius

7

Versuchen:

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

dies wäre eigentlich eine bessere Leistung:

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

Weil Sie nur eine Spalte aus der Datenbank abrufen.

+0

Sie erhalten zu behalten +1 :) –

+0

Ich brauche andere Spalten für andere Dinge, das ist der ganze Grund, warum ich nicht wollte, ein anderes IQueryable < T> aus der DB –

1

Versuchen Sie folgendes:

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

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

Ich denke, es einfacher ist!

Durch vorerst.

1

Ich weiß, dass dies eine alte Frage, aber warum kann man es tun:

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

Ich bin nicht sicher, wie diese Abfrage Ausdrücke zu tun.

+0

wird es nullreference Fehler Wenn keine Zeilen gefunden, so haben Sie .AsEnumerable(). Sum (o => o.Price) –

+0

@EugeneBosikov verwenden Wie in anderen Antworten erwähnt, das Hinzufügen 'AsEnumerable' wird LINQ verursachen die gesamten Datensatz von dem Server abzurufen und aggregiere es lokal, was viel weniger effizient ist, als wenn die Datenbank die Arbeit erledigt.Außerdem funktioniert die Funktionsweise von LINQ nicht mit einem Null-Referenzfehler, da es einen Ausführungspfad erstellt und erst dann wirklich funktioniert, wenn Sie die Ergebnisse in einer neuen Sammlung ausgeben. – Trisped