2009-04-01 30 views
10

Solo quería comprobar si hay manera de hacerlo distinto por varias columnas. ¡¡¡Gracias por adelantado!!!LINQ to DataSet, distinto por varias columnas

Por cierto, he encontrado una gran extensión de LINQ here pero necesito un poco de orientación para usarlo para varias columnas

Respuesta

31

Bueno, se puede hacer la primera proyección:

var qry = db.Customers.Select(cust => new {cust.ID, cust.Name, cust.Region}) 
        .Distinct(); 

O en la sintaxis de la consulta:

var qry = (from cust in db.Customers 
      select new {cust.ID, cust.Name, cust.Region}).Distinct(); 

Que hacer?

5

Por "distinta por varias columnas" lo que realmente significa es un grupo de.

Cuando pregunta por distinto, significa que está obteniendo TODAS las filas distintas, o un grupo utilizando todas las columnas de la tabla.

Si solo desea obtener agrupaciones distintas para un subconjunto de las columnas, utilice un grupo por en su cláusula, especificando las columnas para agrupar. Luego, seleccione los grupos, ya que solo quiere un conjunto de claves para cada grupo.

11

En lugar de Distinto puede utilizar GroupBy y luego seleccionar el registro Top mayoría de cada grupo

How to LINQ Distinct by Multiple Fields without anonymous types

retorno de o en objEntity

   group o by new 
       { 
        o.Field1, 
        o.Field2, 
        o.Field3, 
        o.Field4, 
        o.Field5 
       } into grp 
       select grp.FirstOrDefault(); 

Esto le dará el EntityObject En lugar de la AnonymousType

1

var qry = (de cust en db.Customers seleccionar nueva {cust.ID, cust.Name, cust.Region}). GroupBy (x => new {x. Nombre, x.Región}). Select (z => z.OrderBy (i => i.cust) .FirstOrDefault()). ToList();

2

Otra opción fácil es crear una única cadena distinta.

var result = collection.DistinctBy(c => c.Field1 + "." + c.Field2 + "." + c.Field3);