none
combiar campos de dos entidades en un dataGridView RRS feed

  • Pregunta

  • ¡Hola!

    Tengo una identidad cliente y otra identidad vehiculos

    si en un dataGrid le cargo una colecction de clientes veo que tengo un campo (entidad vehiculos) pero me gustaría que ahi apareciese su matricula (vehiculos.matricula).   NO doy con la solucion

    ¿Pueden ayudarme?

    gracias!

    domingo, 4 de diciembre de 2016 14:18

Respuestas

  • Carmelo J. Morales Muñoz,

    Entiendo que combinas las filas (join) de ambas entidades para proyectar (select) sólo algunas columnas y para ello implementas un tipo anónimo, ¿verdad?, pues bien, un tipo anónimo no puede existir fuera del contexto donde fue creado, por tanto no podría ser usado como un tipo de retorno en un método. Una manera de resolver este caso es creando un nuevo tipo que contenga a ambos tipos (wrapper) o creando un tipo ad-hoc conteniendo únicamente las propiedades que se desean retornar.

    Vamos a ir por el primer camino y para el ejemplo vamos a mostrar en la grilla dos columnas: el número de matricula y el nombre del cliente al que le pertenece el vehículo:

    - Creamos la clase contenedora:

    public class VehiculosCliente
    {
    	public Clientes Clientes { get; set; }
    	public Vehiculos Vehiculos { get; set; }
    }

    - Creamos el método que retorna una lista de tipo VehiculosCliente

    private List<VehiculosCliente> ListaVehiculos()
    {
    	return (from v in vehiculos
    		join c in clientes on v.idCliente equals c.idCliente
    		select new VehiculosCliente { Vehiculos = v, Clientes = c }).ToList();
    }

    - Finalmente invocamos el método ListaVehiculos()

    private void btnLoadData_Click(object sender, EventArgs e)
    {
    	dataGridView1.DataSource = (from v in ListaVehiculos()
    							   select new
    							   {
    								   Matricula = v.Vehiculos.Matricula,
    								   NombreCliente = v.Clientes.Nombre
    							   }).ToList();
    }

    Nota que las proyecciones (select) las realizamos al momento de vincular la lista a la grilla.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 4 de diciembre de 2016 19:06

Todas las respuestas

  • Carmelo J. Morales Muñoz,

    ¿La relación de asociación es de 'Vehículos' a 'Clientes' o de 'Clientes' a 'Vehículos'?. ¿Un vehículo está asociado a un sólo cliente o un cliente puede tener varios vehículos?. Imagino que la relación es 'Clientes' --> 'Vehículos'

    Si es el primer caso la solución pasa por lo mismo que describes: combinar (join). En caso sea la segunda opción entonces la colección de vehículos debes mostrarlo en otro contenedor de datos asociado por cada cliente seleccionado.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 4 de diciembre de 2016 15:10
  • Gracias por responder.

    Es el primer caso, a modo de ejemplo, un cliente puede tener muchos vehículos pero un vehículo solo pertenece a un cliente.

    Tengo la entidad Clientes y la entidad Vehiculos

    Lo que no se es como fusionar esas dos entidades, bueno mas bien necesito saber el modo de poder devolver una colección que visualice un DataGridView a partir de dos entidades.   Es ahí donde fallo, llevo apenas unos días con EntityFramework. y poca experiencia.

    Si puedes ponerme un ejemplo te lo agradezco.

    domingo, 4 de diciembre de 2016 17:19
  • Carmelo J. Morales Muñoz,

    Pero vamos, ¿qué es lo que deseas mostrar en la grilla de datos? Si deseas mostrar los clientes y cada cliente tiene "n" vehículos, ¿como representarás los datos? ¿En una fila colocarás los datos del cliente y todos sus vehículos asociados?

    Si colocas la estructura de como deseas mostrar los datos en la grilla quizá podamos ofrecerte una aproximación para resolver el caso, pero desde ya te digo que esas relaciones de uno a muchos se suele mostrar con un contenedor de datos separado a menos que la grilla permita mostrar información vinculada por fila (la clase DataGridView no lo trae de "fábrica").


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 4 de diciembre de 2016 17:28
  • Tienes razón, no era un buen ejemplo....

    De todos modos la consulta con Linq ya la tengo. en un Var resultado = .....

    ahora el problema es que cuando quiero devolver un return resultado.ToList();   me dice que la función retun no corresponde con la función. Es decir, ¿como debo declarar la función?...   yo habia hecho:

    public List<Object>  Milistado (..... etc

    return resultado.toList();   pero dice que return es un tipo distinto.

    si hago datagrid.datasource = resultado.ToList();   todo va bien...   lo que no se es como dar el resultado desde una función con return.

    ¿puedes ayudarme ahí?.

    domingo, 4 de diciembre de 2016 18:02
  • Carmelo J. Morales Muñoz,

    Entiendo que combinas las filas (join) de ambas entidades para proyectar (select) sólo algunas columnas y para ello implementas un tipo anónimo, ¿verdad?, pues bien, un tipo anónimo no puede existir fuera del contexto donde fue creado, por tanto no podría ser usado como un tipo de retorno en un método. Una manera de resolver este caso es creando un nuevo tipo que contenga a ambos tipos (wrapper) o creando un tipo ad-hoc conteniendo únicamente las propiedades que se desean retornar.

    Vamos a ir por el primer camino y para el ejemplo vamos a mostrar en la grilla dos columnas: el número de matricula y el nombre del cliente al que le pertenece el vehículo:

    - Creamos la clase contenedora:

    public class VehiculosCliente
    {
    	public Clientes Clientes { get; set; }
    	public Vehiculos Vehiculos { get; set; }
    }

    - Creamos el método que retorna una lista de tipo VehiculosCliente

    private List<VehiculosCliente> ListaVehiculos()
    {
    	return (from v in vehiculos
    		join c in clientes on v.idCliente equals c.idCliente
    		select new VehiculosCliente { Vehiculos = v, Clientes = c }).ToList();
    }

    - Finalmente invocamos el método ListaVehiculos()

    private void btnLoadData_Click(object sender, EventArgs e)
    {
    	dataGridView1.DataSource = (from v in ListaVehiculos()
    							   select new
    							   {
    								   Matricula = v.Vehiculos.Matricula,
    								   NombreCliente = v.Clientes.Nombre
    							   }).ToList();
    }

    Nota que las proyecciones (select) las realizamos al momento de vincular la lista a la grilla.


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    domingo, 4 de diciembre de 2016 19:06
  • Gracias!.... 
    sábado, 10 de diciembre de 2016 20:01