Principales respuestas
Realizar metodo de union de 2 tablas y luego consumirlo

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.
Gracias de antemano.Iqueryable<?> = DevuelveClientePlanDeMillas(List<Cliente>, List<PlanDeMillas>)
- Editado RealMaster martes, 9 de diciembre de 2014 20:18
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
-
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
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
-
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
-
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; }