Me gustaría agrupar mi consulta LINQ por ItemNumber
y devolver toda la tabla con el total de Quantity
.Grupo de expresiones Lambda en C#
Example:
ItemNumber - ItemName - Quantity
100 Item1 1
150 Item2 2
100 Item1 2
200 Item3 1
150 Item2 2
Should be:
ItemNumber - ItemName - Quantity
100 Item1 3
150 Item2 4
200 Item3 1
Esta es la consulta que estoy tratando de grupo:
public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted
(string accountNumber)
{
return db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1);
}
Y mi mejor resultado hasta el momento (esto no se puede compilar sin embargo):
public IQueryable<IGrouping<Int32?, WebsiteOrderStatus>> lol(string accountNumber)
{
db.WebsiteOrderStatus
.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1)
.GroupBy(g => g.ItemNumber)
.Select(g => new
{
g.Key.ItemNumber,
Column1 = (Int32?)g.Sum(p => p.Quantity)
});
}
EDIT:
Gracias por las respuestas de todos, debo enfrentarlo. En mi opinión, estos tipos anónimos son bastante difíciles de trabajar, así que encontré otra solución.
Hice otro método, que suma la cantidad de elementos de los usuarios y agrupó el primero.
public IQueryable<WebsiteOrderStatus> GetOrderStatusByAccountNumberWithoutDeleted(string accountNumber)
{
return db.WebsiteOrderStatus.Where(x => x.AccountNumber == accountNumber && x.LastUpdatedStatus != 1).GroupBy(x => x.ItemNumber).Select(grp => grp.First());
}
public int GetQuantityOfUsersItem(string accountNumber, string itemNumber)
{
return db.WebsiteOrderStatus.Where(x => x.ItemNumber == itemNumber && x.AccountNumber == accountNumber).Sum(x => x.Quantity);
}
En la página donde tengo mi gridview que hice:
var query = websiteOrderStatusRep.GetOrderStatusByAccountNumberWithoutDeleted(AppSession.CurrentLoginTicket.AccountNumber).Select(x => new { x.ItemName, x.ItemNumber, x.FormatName, x.Price, x.Status, x.Levering, Quantity = websiteOrderStatusRep.GetQuantityOfUsersItem(x.AccountNumber, x.ItemNumber)});
No está seguro de qué otra cosa está mal, pero al menos, usted' falta un "retorno" en la segunda muestra. – Ani
¿Cuál es el error de compilación que está obteniendo? –
Probablemente está tratando de tratar a g.Key como un objeto, mientras que es solo el int. Si quiere el nombre del elemento en el resultado, entonces también tendrá que almacenarlo en el objeto clave (y convertir las teclas en un objeto que sea comparable) o leerlo de la primera entrada en el enumberator del grupo, supongo. – Rup