2009-03-13 6 views
25

J'ai quelque chose comme ceci:LINQ to SQL .sum() sans groupe ... en

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

est-il possible de faire un

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

pour obtenir la somme des o. WishListItem.Price ou dois-je obtenir un autre iQueryable < T> de la base de données avec le groupe ... dans?

Répondre

52

Qu'en est-:

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

AsEnumerable fait la différence, cette requête exécutera localement (LINQ to Objects).

+0

c'est encore mieux, thanx –

15

vous pouvez:

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

Pour frapper la seule fois db faire:

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

Le voyage aller-retour supplémentaire sauvé est la peine :)

+0

Impossible de traduire l'expression '(...). Sélectionnez (o => o.Prix) .Sum()' dans SQL et n'a pas pu le traiter comme une expression locale. –

+0

Essayez itemsCard.ToList(). Sélectionnez (c => c.Prix) .Sum(); –

+0

@rm Si vous obtenez l'info de toute façon, faites comme Jonathan mentionné (enregistrez la liste sur une variable, de sorte que vous obtenez seulement les données une fois). – eglasius

7

Essayez:

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

En fait, ce serait mieux performer:

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

Parce que vous ne récupérez qu'une colonne de la base de données.

+0

vous obtenez de garder +1 :) –

+0

J'ai besoin d'autres colonnes pour d'autres choses, c'est toute la raison pour laquelle je ne voulais pas obtenir un autre IQueryable < T> de la DB –

1

Essayez ceci:

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

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

Je pense qu'il est plus facile!

Par pour l'instant.

1

Je sais c'est une vieille question, mais pourquoi ne pouvez-vous le faire comme:

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

Je ne sais pas comment faire en utilisant des expressions de requête.

+0

ce sera une erreur de référence aucune ligne trouvée, donc vous devez utiliser .AsEnumerable(). Sum (o => o.Prix) –

+0

@EugeneBosikov Comme cela a été noté dans d'autres réponses, l'ajout de 'AsEnumerable' entraînera LINQ à récupérer l'ensemble des données du serveur et l'agréger localement, ce qui est beaucoup moins efficace que de faire travailler la base de données.De plus, le fonctionnement de LINQ n'obtiendra pas une erreur de référence NULL car il crée un chemin d'exécution et ne fonctionne pas réellement tant que vous n'avez pas sorti les résultats dans une nouvelle collection. – Trisped