none
Join con Linq RRS feed

  • Pregunta

  • Hola Buenas tardes

    Queria ver si me podrian apoyar con las siguientes dudas

    primero yo tengo una clase de este tipo

    public class User
        {
            public int Id { get; set; }
            public string Phone { get; set; }
            public string FullName { get; set; }
    
            public string Display
            {
                get
                {
                    return Id.ToString() + "    " + this.Phone + "    " + FullName;
                }
            }
        }

    segundo yo lleno las siguientes listas

    this.usersALeft = new List<User>();
                this.usersBRight = new List<User>();
                this.usersCJoin = new List<User>();
    
    
                User userGustavo = new User(){ Id = 1, FullName = "Gustavo", Phone = "8113293986" };
                User userKarina = new User() { Id = 2, FullName = "Karina", Phone = "8123440866" };
                User userOrduño = new User() { Id = 3, FullName = "Roberto", Phone = "8110622377" };
                User userPatricia = new User() { Id = 4, FullName = "Patricia", Phone = "8110435622" };
    
                this.usersALeft.Add(userGustavo);
                this.usersALeft.Add(userKarina);
                this.usersALeft.Add(userOrduño);
                this.usersALeft.Add(userPatricia);
    
                User userCarlos = new User() { Id = 5, FullName = "Carlos", Phone = "8114562377" };
                User userSebastian = new User() { Id = 6, FullName = "Sebastian", Phone = "8114444444" };
    
                this.usersBRight.Add(userGustavo);
                this.usersBRight.Add(userKarina);
                this.usersBRight.Add(userCarlos);
                this.usersBRight.Add(userSebastian);
    
                LstLeftA.ValueMember = "Id";
                LstLeftA.DisplayMember = "Display";
                LstLeftA.DataSource = this.usersALeft;
    
                LstRigthB.ValueMember = "Id";
                LstRigthB.DisplayMember = "Display";
                LstRigthB.DataSource = this.usersBRight;

    la lista A de izquierda y la lista B de derecha

    el join me funciona muy bien por medio de una clave compuesta.

    public List<User> GetInnerJoin(List<User> usersA, List<User> usersB)
            {
                List<User> usersInnerJoin = (from A in usersA
                                           join B in usersB
                                           on new { A.Id, A.Phone }
                                           equals new { B.Id, B.Phone }
                                           select new User()
                                           {
                                               Id = A.Id,
                                               Phone = A.Phone,
                                               FullName = A.FullName
                                           }).ToList();
                return usersInnerJoin;
            }

    con este metodo obtendo el innerJoin y funciona Perfectamente

    y con este otro metodo obtengo todo el centro y la izquierda

    public List<User> GetleftJoin(List<User> usersA, List<User> usersB)
            {
                List<User> usersLeftJoin = (from A in usersA
                                            join B in usersB
                                            on new { A.Id, A.Phone }
                                            equals new { B.Id, B.Phone }
                                            into leftUsers
                                            from C in leftUsers.DefaultIfEmpty( new User()
                                            {
                                                Id = 0,
                                                FullName = "No disponible",
                                                Phone = ""
                                            })
                                            select new User()
                                            {
                                                Id = A.Id,
                                                Phone = A.Phone,
                                                FullName = A.FullName
                                            }).ToList();
                return usersLeftJoin;
            }

    Tambien funciona perfectamente.

    Con este otro metodo Obtengo toda la derecha y el centro lo unico que hice fue invertir el orden de las listas

    public List<User> GetRightJoin(List<User> usersA, List<User> usersB)
            {
                List<User> usersLeftJoin = (from A in usersB
                                            join B in usersA
                                            on new { A.Id, A.Phone }
                                            equals new { B.Id, B.Phone }
                                            into leftUsers
                                            from C in leftUsers.DefaultIfEmpty(new User()
                                            {
                                                Id = 0,
                                                FullName = "No disponible",
                                                Phone = ""
                                            })
                                            select new User()
                                            {
                                                Id = A.Id,
                                                Phone = A.Phone,
                                                FullName = A.FullName
                                            }).ToList();
                return usersLeftJoin;
            }

    pero me falta como Obtener Solo la derecha No quiero el Centro  y no quiero la izquierda

    deberian ser estos registro

    User userCarlos = new User() { Id = 5, FullName = "Carlos", Phone = "8114562377" };
    User userSebastian = new User() { Id = 6, FullName = "Sebastian", Phone = "8114444444" };

    Como Puedo Obener ese resultado

    jueves, 4 de abril de 2019 19:01

Respuestas

  • ok entiendo

    pero basicamente seria jugar con esa misma consulta quizas usando

    List<User> usersLeftJoin = (from A in usersB
    				join B in usersA on new { A.Id, A.Phone } equals new { B.Id, B.Phone } into leftUsers
    				from C in leftUsers.DefaultIfEmpty()
    				where C == null
    				select A).ToList();

    si pones null seria los que no tienen relacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel viernes, 5 de abril de 2019 2:57
    viernes, 5 de abril de 2019 0:06

Todas las respuestas

  • hola

    no estoy muy seguro que esten bien implementadas esas queries, por ejemplo

    creo que seria

    	public List<User> GetRightJoin(List<User> usersA, List<User> usersB)
    	{
    		List<User> usersLeftJoin = (from A in usersB
    					      join B in usersA on new { A.Id, A.Phone } equals new { B.Id, B.Phone } into leftUsers
    						from C in leftUsers.DefaultIfEmpty()
    						where C != null
    						select A).ToList();
    									
    		return usersLeftJoin;
    	} 

    no veo porque remapeas creando nuevos "User" en el linq si siempre A que es la lista completa

    Tampoco entiendo porque Phone es un identifiador de la entidad que lo usas para igualar, eso es raro porque podrias tener el mismo usuario con un fomato de telefono diferente, deberias solo igualar con Id en al join

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    jueves, 4 de abril de 2019 19:48
  • 

    el Codigo que pusiste leandro regresa el resultado de la foto, que debe regresar es todo lo que no esta en la izquierda y no esta en la derecha debe regresar a carlos y sebastian

    tienes razon si retorno una lista de users no deberia estar creando objetos nuevos.

    Aqui se trata de que un usuario siempre debe tener un Id y Un solo telefono

    jueves, 4 de abril de 2019 22:12
  • Busco ese resultado

    jueves, 4 de abril de 2019 22:50
  • ok entiendo

    pero basicamente seria jugar con esa misma consulta quizas usando

    List<User> usersLeftJoin = (from A in usersB
    				join B in usersA on new { A.Id, A.Phone } equals new { B.Id, B.Phone } into leftUsers
    				from C in leftUsers.DefaultIfEmpty()
    				where C == null
    				select A).ToList();

    si pones null seria los que no tienen relacion

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    • Marcado como respuesta niqel viernes, 5 de abril de 2019 2:57
    viernes, 5 de abril de 2019 0:06