Principales respuestas
Distinct no funciona en consulta Linq

Pregunta
-
Saludos comunidad tengo el siguiente problema:
Quiero utilizar Distinct para filtrar la lista de apellidos que tengo y no me salgan repetidos, pero no me funciona, tengo el siguiente codigo:
public List<Persons> BuscaEstudianteLike(string Apellido) { try { using(SchoolEntities db = new SchoolEntities()) { var query = (from Est in db.Persons.ToList() where Est.LastName.Contains(Apellido) orderby Est.LastName ascending select new Persons { LastName = Est.LastName }).Distinct().Take(4); return query.ToList(); } } catch(Exception ex) { error = ex.Message.ToString(); return new List<Persons>(); }
Pero el resultado es el siguiente:
Gracias por su tiempo.
- Editado RealMaster miércoles, 25 de febrero de 2015 19:46
Respuestas
-
hola
para que funcione cuando aplicas el distinct a una clase debes implementar el IEquatable<>
[Linq] Distinct y GroupBy usando IEquatable<>
de esta forma puedes inicar por cual propiedad debe aplicar la comparacion
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta RealMaster miércoles, 25 de febrero de 2015 19:46
Todas las respuestas
-
hola
para que funcione cuando aplicas el distinct a una clase debes implementar el IEquatable<>
[Linq] Distinct y GroupBy usando IEquatable<>
de esta forma puedes inicar por cual propiedad debe aplicar la comparacion
saludos
Leandro Tuttini
Blog
MVP Profile
Buenos Aires
Argentina- Marcado como respuesta RealMaster miércoles, 25 de febrero de 2015 19:46
-
La razón de que no te funcione es que en la consulta Linq no haces "select Est.LastName" sino que haces "select new Person..." y dentro de Person rellenas únicamente el LastName.
La cláusula distinct compara el objeto completo. Como lo que tienes es una lista de Person, compara el Person al completo. Y el comparador de clases predeterminado hace una comparación por dirección, así que aunque los Person sólo tienen relleno el Apellido, como cada uno proviene de un "new...", todos tienen dirección diferente y en consecuencia considera que los Person son diferentes aunque su contenido sea el mismo.
El remedio, si quieres que los Person se comparen por valor y no por dirección, es el que te ha dicho Leandro, es decir, implementar dentro de Person una interfaz de comparación que compare en función de los campos que tú quieras.