c# - Distinto en Linq basado en solo un campo de la tabla
linq distinct by field (9)
pero necesito resultados donde r.text no está duplicado
Suena como si quisieras esto:
table1.GroupBy(x => x.Text)
.Where(g => g.Count() == 1)
.Select(g => g.First());
Esto seleccionará las filas donde el Text
es único.
Intento usar .distinct en Linq para obtener un resultado basado en un campo de la tabla (por lo tanto, no es necesario un registro completo de la tabla).
Sé escribir una consulta básica usando distinct de la siguiente manera:
var query = (from r in table1
orderby r.Text
select r).distinct();
pero necesito resultados donde r.text
no está duplicado.
Hay muchas discusiones sobre este tema.
Puedes encontrar uno de ellos here :
Una de las sugerencias más populares ha sido el método Distinct tomando una expresión lambda como parámetro como @Servy ha señalado.
El principal arquitecto de C #, Anders Hejlsberg, sugirió la solución here . También explica por qué el equipo de diseño del marco decidió no agregar una sobrecarga del método Distinct que toma una lambda.
La respuesta de arriba conduce a una excepción System.NotSupported
With Entity-Framework . Con Entity-Framework , tiene que ser:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
MoreLinq tiene un método DistinctBy que puedes usar:
Te permitirá hacer:
var results = table1.DistictBy(row => row.Text);
La implementación del método (a excepción de la validación de argumentos) es la siguiente:
private static IEnumerable<TSource> DistinctByImpl<TSource, TKey>(IEnumerable<TSource> source,
Func<TSource, TKey> keySelector, IEqualityComparer<TKey> comparer)
{
HashSet<TKey> knownKeys = new HashSet<TKey>(comparer);
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
Por lo que he encontrado, su consulta es en su mayoría correcta. Simplemente cambie "select r" por "select r.Text" y todo eso resolverá el problema. Así es como MSDN documentó cómo debería funcionar.
Ex:
var query = (from r in table1 orderby r.Text select r.Text).distinct();
Prueba esto:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
Esto agrupará la tabla por Text
y usará la primera fila de cada grupo que resultará en filas donde el Text
es distinto.
Puede probar esto: table1.GroupBy(t => t.Text).Select(shape => shape.r)).Distinct();
prueba este código:
table1.GroupBy(x => x.Text).Select(x => x.FirstOrDefault());
data.Select(x=>x.Name).Distinct().Select(x => new SelectListItem { Text = x });