2011-05-12 23 views
10

dado:LINQ distintos en campo específico

var s = (from p in operatorList      
    select p.ID, p.Name,p.Phone) 

¿Cómo voy a devolver los registros distintos basados ​​sólo en la identificación?

+2

Este Q se parece mucho a [eliminar basada duplicados en la columna de valor LINQ] (http://stackoverflow.com/q/3446442/590956) – Sam

Respuesta

14

Puede escribir un IEqualityComparer que compare los valores ID y pasarlo al overloaded Queryable.Distinct method, pero dado que esto es LINQ to SQL, no será admitido en la base de datos. Debería agregar una llamada al AsEnumerable method para que funcione, pero esto no se recomienda para grandes cantidades de datos porque usted estaría llevando los datos al lado del cliente. Si decide ir por ese camino que va a terminar con una consulta similar a:

var query = dc.Operators.AsEnumerable().Distinct(new OperatorEqualityComparer()); 

La otra opción, lo que hace que la base de datos haga el trabajo, es agrupar por ID y toma el primer elemento de cada grupo:

var query = from p in dc.Operators 
      group p by p.ID into groups 
      select groups.First(); 
7

Si quiere añadir la capacidad de hacer esto como un método de extensión, aquí hay un método llamado DistinctBy que se lleva en la fuente y keySelector como parámetros y devuelve el conjunto de objetos distintos. Hace lo mismo que la segunda consulta de Ahmad, pero se ve un poco más bonita en línea.

C#:
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(
           this IEnumerable<TSource> source, 
           Func<TSource, TKey> keySelector) 
{ 
    return source.GroupBy(keySelector).Select(i => i.First()); 
} 
VB:
<Extension()> 
Public Function DistinctBy(Of TSource, TKey)(
        ByVal source As IEnumerable(Of TSource), 
        ByVal keySelector As Func(Of TSource, TKey)) 
        As IEnumerable(Of TSource) 

    Return source.GroupBy(keySelector).Select(Function(i) i.First()) 
End Function 

Entonces llaman así:

var s = (from p in operatorList.DistinctBy(x => x.ID)      
     select p.ID, p.Name, p.Phone) 
Cuestiones relacionadas