none
Problema con listar una query con Linq RRS feed

  • Pregunta

  • Estimados, esoy teniendo problemas con un método para listar una tabla desde SQL server


    Tengo un método que devuelve un listado de clientes, dentro del método realizo una consulta Linq con variables anonimas pero me arroja el siguiente error:

    "cannot implicitly convert type System.Collections.Generic.List <anonymous type#1> to System.Collections.Generic.List<Negocio.Cliente>"

    public List<Cliente> listado() { //Lista que quiero retornar List<Cliente> listaReturn = new List<Cliente>(); var queryList = (from clt in AccesoDB.Modelo.Cliente join cna in AccesoDB.Modelo.Comuna on clt.Id_comuna equals cna.Id_comuna select new { NombreCliente = clt.Nombre, Rut = clt.Rut, comunaId = cna.nombre_comuna }); listaReturn = queryList.ToList(); //-->aqui me arroja el error return listaReturn;

    //Tambien probé sin el list interno, es decir

    // return queryList.ToList(); }

    Por lo que dice el mensaje debe ser un error de conversión en el momento en que asigno "ToList()" a mi queryList, en que puedo estar fallando ?  Que debo tener en consideración a la hora de hacer un ToList() a una consulta linq ??



    jueves, 8 de diciembre de 2016 5:14

Respuestas


  • me arroja error al momento de asignar los valores 

    Es por que tienes error en la función, debería ser así:

    public List<ListaSolicitud> listar()
            {
                return (from clt in AccesoDB.Modelo.Cliente
                        join cna in AccesoDB.Modelo.Comuna
                        on clt.Id_comuna equals cna.Id_comuna
                        select new ListaSolicitud() { Cliente = clt.Campo1, Comuna = cna.Campo2 }).ToList();
              
            }


    Antonio Mata


    • Editado A. Mata jueves, 8 de diciembre de 2016 20:13
    • Propuesto como respuesta Joyce_ACModerator viernes, 9 de diciembre de 2016 15:57
    • Marcado como respuesta Joyce_ACModerator jueves, 15 de diciembre de 2016 16:27
    jueves, 8 de diciembre de 2016 20:12
  • hola

    >>dice que no se puede convertir una variable de la base de datos a una variable de tipo negocio, por que sucede eso ?

    el mensaje se explica por si mismo, no es lo mismo un Cliente que proviene del namespace AccesoDB.Modelo.Cliente que otro definido en otro lugar por mas que tengan las mismas propiedades, debe ser la misma clase o sino convertir de un tipo Cliente que defines dentro de EF a otro cliente que defienes en una clase diferente

    es alli donde se usa automapper

    para ahcer mas simple la conversion entre estas clases

    >>De la forma que me resultó fue declarando los campos con variables String directamente y no cómo objetos

    pero solo devuelves el nombre ? o la idea es retornar mas propiedades? porque podrias hacer

    public List<ListaSolicitud> listar()
    {
    	var result =  (from clt in AccesoDB.Modelo.Cliente
    					join cna in AccesoDB.Modelo.Comuna on clt.Id_comuna equals cna.Id_comuna
    					select new ListaSolicitud()
    					{ 
    						Cliente = new Cliente() 
    						{
    							Id = clt.Id,
    							Nombre = clt.Nombre,
    							//resto propiedades
    						}, 
    						Comuna = new Comuna()
    						{
    							Id = cna.Id,
    							Descripcion = cna.Descripcion,
    							//resto propiedades
    						}				 
    					}).ToList();
    
    	return result;
    }

    ese mapeao que realice propiedad a propiedad dentro de cliente y comuna es donde ayudaria automapper

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de diciembre de 2016 4:22

Todas las respuestas

  • loopsInfinite,

    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.

    Te dejo un hilo con una pregunta similar y una propuesta de solución al caso Combinar campos de dos entidades (fíjate en la última respuesta)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.
    • Marcado como respuesta loopsInfinite jueves, 8 de diciembre de 2016 6:19
    • Desmarcado como respuesta loopsInfinite jueves, 8 de diciembre de 2016 19:41
    jueves, 8 de diciembre de 2016 5:21
  • loopsInfinite,

    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.

    Te dejo un hilo con una pregunta similar y una propuesta de solución al caso Combinar campos de dos entidades (fíjate en la última respuesta)


    Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.


     Gracias por responder william pero aún tengo problemas,


     intentando seguir los pasos de la última respuesta de ese link hice lo siguiente:


    Cree mi clase contenedora

    public Comuna Comuna { get; set; }
    public Cliente Cliente { get; set; }

    Luego en esa misma clase el método listar:

    public List<ListaSolicitud> listar()
            {
                return (from clt in AccesoDB.Modelo.Cliente
                        join cna in AccesoDB.Modelo.Comuna
                        on clt.Id_comuna equals cna.Id_comuna
                        select new ListaSolicitud { Cliente = clt, Comuna = cna }).ToList();
    
                
            }

    me arroja error al momento de asignar los valores

    Cliente = clt, Comuna = cna 

    dice que no se puede convertir una variable de la base de datos a una variable de tipo negocio, por que sucede eso ?  probe también asi:

    Cliente.Nombre = clt, Comuna.Nombre = cna

    Ahí me marca el error "Miembro inizializador inválido"


    De la forma que me resultó fue declarando los campos con variables String directamente y no cómo objetos

    así:


    public string NombreComuna { get; set; } public string NombreCliente { get; set; }

     

      gracias de antemano, estaré atento a cualquier comentario.. saludos
    jueves, 8 de diciembre de 2016 19:57

  • me arroja error al momento de asignar los valores 

    Es por que tienes error en la función, debería ser así:

    public List<ListaSolicitud> listar()
            {
                return (from clt in AccesoDB.Modelo.Cliente
                        join cna in AccesoDB.Modelo.Comuna
                        on clt.Id_comuna equals cna.Id_comuna
                        select new ListaSolicitud() { Cliente = clt.Campo1, Comuna = cna.Campo2 }).ToList();
              
            }


    Antonio Mata


    • Editado A. Mata jueves, 8 de diciembre de 2016 20:13
    • Propuesto como respuesta Joyce_ACModerator viernes, 9 de diciembre de 2016 15:57
    • Marcado como respuesta Joyce_ACModerator jueves, 15 de diciembre de 2016 16:27
    jueves, 8 de diciembre de 2016 20:12
  • hola

    >>dice que no se puede convertir una variable de la base de datos a una variable de tipo negocio, por que sucede eso ?

    el mensaje se explica por si mismo, no es lo mismo un Cliente que proviene del namespace AccesoDB.Modelo.Cliente que otro definido en otro lugar por mas que tengan las mismas propiedades, debe ser la misma clase o sino convertir de un tipo Cliente que defines dentro de EF a otro cliente que defienes en una clase diferente

    es alli donde se usa automapper

    para ahcer mas simple la conversion entre estas clases

    >>De la forma que me resultó fue declarando los campos con variables String directamente y no cómo objetos

    pero solo devuelves el nombre ? o la idea es retornar mas propiedades? porque podrias hacer

    public List<ListaSolicitud> listar()
    {
    	var result =  (from clt in AccesoDB.Modelo.Cliente
    					join cna in AccesoDB.Modelo.Comuna on clt.Id_comuna equals cna.Id_comuna
    					select new ListaSolicitud()
    					{ 
    						Cliente = new Cliente() 
    						{
    							Id = clt.Id,
    							Nombre = clt.Nombre,
    							//resto propiedades
    						}, 
    						Comuna = new Comuna()
    						{
    							Id = cna.Id,
    							Descripcion = cna.Descripcion,
    							//resto propiedades
    						}				 
    					}).ToList();
    
    	return result;
    }

    ese mapeao que realice propiedad a propiedad dentro de cliente y comuna es donde ayudaria automapper

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    lunes, 12 de diciembre de 2016 4:22