none
Distinct no funciona en consulta Linq RRS feed

  • 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
    miércoles, 25 de febrero de 2015 0:27

Respuestas

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
    miércoles, 25 de febrero de 2015 3:50
  • 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.

    miércoles, 25 de febrero de 2015 6:27