¿Cómo puedo hacer GroupBy Multiple Columns en LINQ?
Algo similar a esto en SQL:
SELECT * FROM <TableName> GROUP BY <Column1>,<Column2>
¿Cómo puedo convertir esto a LINQ?
QuantityBreakdown
(
MaterialID int,
ProductID int,
Quantity float
)
INSERT INTO @QuantityBreakdown (MaterialID, ProductID, Quantity)
SELECT MaterialID, ProductID, SUM(Quantity)
FROM @Transactions
GROUP BY MaterialID, ProductID
Muestra de procedimiento
fuente
Ok tengo esto como:
fuente
Para Agrupar por varias columnas, intente esto en su lugar ...
De la misma manera, puede agregar Column3, Column4, etc.
fuente
Result
contiene todos los conjuntos de datos vinculados a todas las columnas. ¡Muchas gracias!Desde C # 7 también puede usar tuplas de valor:
o
fuente
C # 7.1 o superior utilizando
Tuples
yInferred tuple element names
(actualmente sólo funciona conlinq to objects
y no se admite cuando los árboles de expresión se requieren por ejemplosomeIQueryable.GroupBy(...)
. Tema Github ):C # 3 o superior usando
anonymous types
:fuente
También puede usar una Tupla <> para una agrupación fuertemente tipada.
fuente
Aunque esta pregunta es acerca de las propiedades de agrupar por clase, si desea agrupar por múltiples columnas contra un objeto ADO (como un DataTable), debe asignar sus elementos "nuevos" a las variables:
fuente
fuente
fuente
Linq.Enumerable.Aggregate()
esto incluso permite la agrupación de un número dinámico de propiedades:propertyValues.Aggregate((current, next) => current + " " + next)
..GroupBy(x => (x.MaterialID, x.ProductID))
fuente
grupo x por nuevo {x.Col, x.Col}
fuente
Una cosa a tener en cuenta es que debe enviar un objeto para las expresiones Lambda y no puede usar una instancia para una clase.
Ejemplo:
Esto compilará pero generará una clave por ciclo .
Si no quiere nombrar las propiedades clave y luego recuperarlas, puede hacerlo así. Esto lo hará
GroupBy
correctamente y le dará las propiedades clave.fuente
Para VB y anónimo / lambda :
fuente