2009-03-13 34 views
25

tengo algo como esto:LINQ a SQL .sum() sin grupo ... en

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

¿hay alguna manera de hacer un

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

para obtener la suma de o. WishListItem.Price o tengo que obtener otro iQueryable < T> de la base de datos con el grupo ... en?

Respuesta

52

¿Qué hay de:

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

AsEnumerable hace la diferencia, esta consulta se ejecutará localmente (LINQ to Objects).

+0

que es aún mejor, thanx –

15

puede:

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

Para golpear el PP lo hacen sólo una vez:

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

El extra de ida y vuelta salvado vale la pena :)

+0

No se pudo traducir la expresión '(...). Seleccione (o => o.Price) .Sum()' en SQL y no podría tratarlo como una expresión local. –

+0

Pruebe itemsCard.ToList(). Seleccione (c => c.Precio) .Sum(); –

+0

@rm si recibe la información de todos modos, haga lo que mencionó Jonathan (guarde la lista en una variable, de modo que solo obtenga los datos una vez). – eglasius

7

Probar:

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

En realidad esto podría dar mejores resultados:

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

Porque solo estará recuperando una columna de la base de datos.

+0

consigues mantener +1 :) –

+0

Necesito otras columnas para otras cosas, esa es la razón por la que no quería obtener otra IQueryable < T> de la DB –

1

Prueba esto:

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

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

Creo que es más simple!

Por ahora.

1

Sé que esto es una cuestión de edad, sino por qué no puedes hacerlo así:

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

no estoy seguro de cómo hacer esto usando expresiones de consulta.

+0

será error de nullreference If no se encontraron filas, por lo que debe usar .AsEnumerable(). Sum (o => o.Price) –

+0

@EugeneBosikov Como se ha indicado en otras respuestas, agregar 'AsEnumerable' hará que LINQ recupere todo el conjunto de datos del servidor y agregarlo localmente, que es mucho menos eficiente que hacer que la base de datos haga el trabajo.Además, la forma en que funciona LINQ no tendrá un error de referencia nulo porque está construyendo una ruta de ejecución, y en realidad no hace ningún trabajo hasta que genere los resultados a una nueva colección. – Trisped