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?
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?
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();
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.
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)
Este Q se parece mucho a [eliminar basada duplicados en la columna de valor LINQ] (http://stackoverflow.com/q/3446442/590956) – Sam