none
Obtener lista de objetos a partir de listas relacionadas RRS feed

  • Pregunta

  • Hola,

    describo un poco mi escenario. Tengo las siguientes clases:

    public class Cuenta_poco { 
       public int Id_Cta {get; set;} 
       public string Desc_Cta  {get; set;} 
    }
    
    public class Usuario_poco { 
       public int Id_Usuario {get; set;} 
       public string Desc_Usuario  {get; set;} 
    }
    
    public class RelUsuarioCta_poco { 
       public int Id_Cta {get; set;} 
       public int Id_Usuario  {get; set;} 
    }
    
    public class Cuenta() { 
       public List<Cuenta_poco> GetCuentas(filtro) 
       {//Devuelve lista } 
    }
    
    public class Usuario() { 
       public List<Usuario_poco> GetUsuarios() 
       {//Devuelve lista } 
    }
    
    public class RelUsuarioCta() { 
       public List<RelUsuarioCta_poco> GetRelaciones()   
       {//Devuelve lista } 
    }
    

    Lo que necesito es, en una única sentencia LINQ (si es posible) obtener los Usuarios que están asociados a la lista de Cuentas obtenida.

    Un saludo y gracias.

    lunes, 9 de enero de 2017 14:48

Todas las respuestas

  • C_A_R,

    Siendo que los métodos que retornan los datos son miembros de clases distintas debes crear una instancia de cada una de las clases y luego combinar las filas que retorna cada método para obtener la cuenta y los usuarios asociados, algo como:

    Cuenta cuenta = new Cuenta();
    RelUsuarioCta usuarioCuenta = new RelUsuarioCta();
    Usuario usuario = new Usuario();
    
    var usuariosCuenta = (from c in cuenta.GetCuentas(2)
    			 join uc in usuarioCuenta.GetRelaciones() on c.Id_Cta equals uc.Id_Cta
    			 join u in usuario.GetUsuarios() on uc.Id_Usuario equals u.Id_Usuario
    			 select new { Cuenta = c.Desc_Cta, Usuario = u.Desc_Usuario }).ToList();


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta C_A_R martes, 10 de enero de 2017 7:53
    • Desmarcado como respuesta C_A_R martes, 10 de enero de 2017 9:00
    lunes, 9 de enero de 2017 16:49
  • hola

    pero esas clases estan completamente desconectadas y no mencionas los metodos GetRelaciones(), GetCuentas() y GetUsuarios() de fode obtienes los datos

    si los obtienes desde una db usando entity framework podrias realizar una sola query uniendo las entidades y no tener 3 clases separadas

    si las listas estan separadas vas a tener que obtenerlas a cada una individual y luego usar el JOIN de linq para relacionarlas

    join (Cláusula, Referencia de C#)

    Cómo: Realizar combinaciones internas (Guía de programación de C#)

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 9 de enero de 2017 17:25
  • Willams,

    después de probar, esta consulta me arroja duplicados.

    He conseguido solucionarlo de esta forma, aunque si combino las dos sentencias en una, el rendimiento disminuye dramáticamente.

    var resultmp = usuariocuenta.GetRelaciones().Where(r => cuenta.GetCuentas(filtro).Any(c => c.Id_Cta == r.Id_Cta)).ToList();					
    var usuarios = usuario.GetUsuarios().Where(u => resultmp.Any(r => r.Id_Usuario == u.Id_Usuario)).ToList();

    • Editado C_A_R martes, 10 de enero de 2017 9:08 Pruebas posteriores
    martes, 10 de enero de 2017 7:56
  • C_A_R,

    No necesitas ejecutar dos consultas por separado, lo adecuado es combinar los conjuntos de datos mediante join. Si obtienes filas duplicadas -que no es de esperar- bastará con agrupar o utilizar alguna instrucción que retorne filas únicas. Sin embargo, ¿has revisado la tabla que contiene los datos duplicados?, una cuenta puede estar asociada a uno o más usuarios y a menos que en la tabla que define la relación N:M hayas registrado mas de una vez a un usuario para la misma cuenta no veo porque tendrías que obtener datos repetidos.

    Te recomiendo que persistas en el uso de join, adjunta la consulta final que has desarrollado (la que retorna duplicados) y déjanos ver una muestra de los datos que obtienes donde se evidencie la duplicidad, de acuerdo a ello podremos darte alguna indicación adicional, no olvides revisar tus datos en búsqueda de duplicidad.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    martes, 10 de enero de 2017 15:12