none
Realizar metodo de union de 2 tablas y luego consumirlo RRS feed

  • Pregunta

  • Saludos comunidad, tengo la siguiente duda:

    Estoy realizando este ejemplo de union de 2 tablas con Linq: http://icomparable.blogspot.com/2008/11/linq-join-sobre-mltiples-listas.html el cual esta muy bien explicado, mi duda es como en la parte que une la 2 tablas:

    var resultado = from cliente in listaClientes
                    join plan in listaPlanes on
                        cliente.IdPlanDeMillas equals plan.Id
                    select new
                               {
                                   cliente.Nombre,
                                   cliente.PaisResidencia,
                                   plan.Plan,
                                   plan.VencenMillas
                               };

    Deberia hacerlo como un metodo y no en el programa principal:

    public Iqueryable<?> DevuelveClientePlanDeMillas(List<Cliente>, List<PlanDeMillas>)
    {
           ??? = from cliente in listaClientes
                    join plan in listaPlanes on
                        cliente.IdPlanDeMillas equals plan.Id
                    select new
                               {
                                   cliente.Nombre,
                                   cliente.PaisResidencia,
                                   plan.Plan,
                                   plan.VencenMillas
                               };
    }

    y luego poder consumir este metodo y poder imprimir sus valores.

    Iqueryable<?> = DevuelveClientePlanDeMillas(List<Cliente>, List<PlanDeMillas>)

    Gracias de antemano.

    • Editado RealMaster martes, 9 de diciembre de 2014 20:18
    martes, 9 de diciembre de 2014 20:16

Respuestas

  • hola

    lo que alli usas es un tipo anonimo, para devolver un resultado de esa forma tienes que aplicar "dynamic" que es una caracteristica de .net 4 o superior

    analiza lo que me responde a mi sobre ese tema

    Code First - Return anonymous object with dynamic

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP miércoles, 10 de diciembre de 2014 4:20
    • Marcado como respuesta RealMaster miércoles, 10 de diciembre de 2014 21:50
    miércoles, 10 de diciembre de 2014 4:19
  • Hay dos maneras, una que retornes una lista de la consulta u otra armar un dto u objeto generico y retornarlo como una lista, pero te voy a hacer el ejemplo para que veas "este devuelve la lista de los elementos #objeto generico que contendra la union de las tablas en una lista".

    // Esta es una clase aparte
    public class CualquierNombre{
    
     public string Nombre { get; set; }
      public string PaisResidencia { get; set; }
     public string Plan { get; set; }
        public bool VencenMillas { get; set; }
    
    }
    
    // ahora en tu clase principal o donde requieres usar el join crea este metodo
    
    public List<CualquierNombre> getJoinTables(List<Cliente> clientes, List<PlanDeMillas> plans){
    // y dentro de este metodo realiza el join
    
    var resultado = from cliente in listaClientes
                    join plan in listaPlanes on
                        cliente.IdPlanDeMillas equals plan.Id
    select new NewType{ 
    Nombre=cliente.Nombre,
    PaisResidencia=cliente.PaisResidencia,
    Plan=plan.Plan,
    VencenMillas=plan.VencenMillas
    
    };
    /// Ahora retornas la lista
     return resultado.ToList();
    
    }

    • Marcado como respuesta RealMaster miércoles, 10 de diciembre de 2014 21:49
    martes, 9 de diciembre de 2014 20:49

Todas las respuestas

  • Hay dos maneras, una que retornes una lista de la consulta u otra armar un dto u objeto generico y retornarlo como una lista, pero te voy a hacer el ejemplo para que veas "este devuelve la lista de los elementos #objeto generico que contendra la union de las tablas en una lista".

    // Esta es una clase aparte
    public class CualquierNombre{
    
     public string Nombre { get; set; }
      public string PaisResidencia { get; set; }
     public string Plan { get; set; }
        public bool VencenMillas { get; set; }
    
    }
    
    // ahora en tu clase principal o donde requieres usar el join crea este metodo
    
    public List<CualquierNombre> getJoinTables(List<Cliente> clientes, List<PlanDeMillas> plans){
    // y dentro de este metodo realiza el join
    
    var resultado = from cliente in listaClientes
                    join plan in listaPlanes on
                        cliente.IdPlanDeMillas equals plan.Id
    select new NewType{ 
    Nombre=cliente.Nombre,
    PaisResidencia=cliente.PaisResidencia,
    Plan=plan.Plan,
    VencenMillas=plan.VencenMillas
    
    };
    /// Ahora retornas la lista
     return resultado.ToList();
    
    }

    • Marcado como respuesta RealMaster miércoles, 10 de diciembre de 2014 21:49
    martes, 9 de diciembre de 2014 20:49
  • hola

    lo que alli usas es un tipo anonimo, para devolver un resultado de esa forma tienes que aplicar "dynamic" que es una caracteristica de .net 4 o superior

    analiza lo que me responde a mi sobre ese tema

    Code First - Return anonymous object with dynamic

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina


    • Editado Leandro TuttiniMVP miércoles, 10 de diciembre de 2014 4:20
    • Marcado como respuesta RealMaster miércoles, 10 de diciembre de 2014 21:50
    miércoles, 10 de diciembre de 2014 4:19
  • Muy buenas las 2 soluciones, encontre una mas, serian en total 3 soluciones, para el mismo problema

    Clases del Problema

    public class Cliente
        {
            public int Id { get; set; }
            public string Nombre { get; set; }
            public string PaisResidencia { get; set; }
            public int IdPlanDeMillas { get; set; }     //Clave Primaria de Plan de Millas, clave foranea en esta clase 
        }


    public class PlanDeMillas
        {
            public int Id { get; set; }
            public string Plan { get; set; }
            public bool VenceMillas { get; set; }
        }

    Clases Auxiliares

    public class ClientePlanDeMillas    //Clase auxiliar que es la Union de las clases Cliente y Plan de Millas
        {
            public int IdCliente { get; set; }
            public string NombreCliente { get; set; }
            public string PaisResidenciaCliente { get; set; }
            public int IdPlanDeMillas { get; set; }
            public string Plan { get; set; }
            public bool VenceMillas { get; set; }
        }


    public class ClienteConPlanDeMillas
        {
            public Cliente Cliente { get; set; }
            public PlanDeMillas PlanDeMillas { get; set; }
        }


    Metodos

    //Funcion que devuelve la union de 2 listas para mandar un IEnumerable, con una Clase Auxiliar que tiene los atributos de las 2 clases
            public IEnumerable<ClientePlanDeMillas> DevuelveUnion(List<Cliente> LCliente, List<PlanDeMillas> LPlandeMilla)
            {
                var resultado = from cliente in LCliente
                                join plan in LPlandeMilla on
                                cliente.IdPlanDeMillas equals plan.Id
                                select new ClientePlanDeMillas
                                {
                                    NombreCliente = cliente.Nombre,
                                    PaisResidenciaCliente = cliente.PaisResidencia,
                                    Plan = plan.Plan,
                                    VenceMillas = plan.VenceMillas
                                };
    
                return resultado.ToList();
            }


     //Funcion que devuelve la union de 2 listas para mandar un IEnumerable, con una Clase Auxiliar que tiene las 2 clases en objetos
            public IEnumerable<ClienteConPlanDeMillas> DevuelveUnion2(List<Cliente> LCliente, List<PlanDeMillas> LPlandeMilla)
            {
                var resultado = from cliente in LCliente
                                join plan in LPlandeMilla on
                                cliente.IdPlanDeMillas equals plan.Id
                                select new ClienteConPlanDeMillas
                                {
                                    Cliente = new Cliente() { Nombre = cliente.Nombre, PaisResidencia = cliente.PaisResidencia },
                                    PlanDeMillas = new PlanDeMillas { Plan = plan.Plan, VenceMillas = plan.VenceMillas}
                                };
    
                return resultado.ToList();
            }
    //Funcion que devuelve la union de 2 listas para mandar un IEnumerable de tipo dynamic
            public IEnumerable<dynamic> DevuelveUnion3(List<Cliente> LCliente, List<PlanDeMillas> LPlandeMilla)
            {
                var resultado = from cliente in LCliente
                                join plan in LPlandeMilla on
                                cliente.IdPlanDeMillas equals plan.Id
                                select new
                                {
                                    cliente.Nombre,
                                    cliente.PaisResidencia,
                                    plan.Plan,
                                    plan.VenceMillas
                                };
    
                return resultado.ToList();
            }


    Programa Principal (ASP . Net Web Forms) se llama a cada metodo desde un boton

    protected void Button1_Click(object sender, EventArgs e)
            {
                List<Cliente> LCliente = ObtenerClientes();
                List<PlanDeMillas> LPlanDeMillas = ObtenerPlanMillas();
    
                var LClientePlanDeMillas = DevuelveUnion(LCliente, LPlanDeMillas);
    
                foreach (var ClientePlan in LClientePlanDeMillas)
                {
                    salida += string.Format(@"El Nombre es: {0} | 
                                              El Pais de residencia es: {1} | 
                                              EL Plan de Vuelo es: {2} | 
                                              Se vencen las millas: {3} <br/>",
                                              ClientePlan.NombreCliente,
                                              ClientePlan.PaisResidenciaCliente,
                                              ClientePlan.Plan,
                                              ClientePlan.VenceMillas);
                }
    
                resultado1.InnerHtml = salida;
            }

    protected void Button2_Click(object sender, EventArgs e)
            {
                List<Cliente> LCliente = ObtenerClientes();
                List<PlanDeMillas> LPlanDeMillas = ObtenerPlanMillas();
    
                var LClientePlanDeMillas = DevuelveUnion2(LCliente, LPlanDeMillas);
    
                foreach (var ClientePlan in LClientePlanDeMillas)
                {
                    salida += string.Format(@"El Nombre es: {0} | 
                                              El Pais de residencia es: {1} | 
                                              EL Plan de Vuelo es: {2} | 
                                              Se vencen las millas: {3} <br/>",
                                              ClientePlan.Cliente.Nombre,
                                              ClientePlan.Cliente.PaisResidencia,
                                              ClientePlan.PlanDeMillas.VenceMillas,
                                              ClientePlan.PlanDeMillas.VenceMillas);
                }
    
                resultado2.InnerHtml = salida;
            }

    protected void Button3_Click(object sender, EventArgs e)
            {
                List<Cliente> LCliente = ObtenerClientes();
                List<PlanDeMillas> LPlanDeMillas = ObtenerPlanMillas();
    
                var LClientePlanDeMillas = DevuelveUnion3(LCliente, LPlanDeMillas);
    
                foreach (var ClientePlan in LClientePlanDeMillas)
                {
                    salida += string.Format(@"El Nombre es: {0} | 
                                              El Pais de residencia es: {1} | 
                                              EL Plan de Vuelo es: {2} | 
                                              Se vencen las millas: {3} <br/>",
                                              ClientePlan.Nombre,
                                              ClientePlan.PaisResidencia,
                                              ClientePlan.Plan,
                                              ClientePlan.VenceMillas);
                }
    
                resultado3.InnerHtml = salida;
            }

    miércoles, 10 de diciembre de 2014 22:08