none
consulta linq to entities RRS feed

  • Pregunta

  • Hola

    Estoy desarrollando una aplicación en asp.net mvc3, estoy utilizando entity framework en un controller tengo que filtrar la información de acuerdo al usuario que se logea dentro de la aplicación, esto es:

    cuando el usuario se logea hago una consulta linq para obtener la empresa a la que pertenece dentro de la aplicación, en mi base de datos tengo tres tablas llamadas Fabricantes, software y empresas relacionadas entre si. como ya he obtenido la empresa a la que pertenece el usuario puedo por medio de inner join obtener informacion de los fabricantes de la empresa a la que pertenece.

    la consulta en lenguaje SQL es:

    select f.Nombre from (Fabricantes f inner join Software s on s.Id_fabricante = f.Id)

    inner join Empresas e on s.Id_Empresa= e.Id where e.Id='(id de empresa del usuario)' group by f.Nombre

    tengo que hacer esta misma consulta pero con linq dentro de una acción de un controller el codigo que he tratado de ejecutar es el siguiente:

            public ViewResult Index()

            {

                MembershipUser myObject = Membership.GetUser();

                Guid user = (Guid)myObject.ProviderUserKey;

     

                var query = from e in db.UsuarioEmpresa

                            where e.UserId == user

                            select e.IdEmpresa;

     

     

                var query2 = from f in db.Fabricantes

                             join s in db.Software on f.Id equals s.Id_Fabricante

                             join m in db.Empresas on s.Id_empresa equals m.Id

                             where m.Id == query.FirstOrDefault()

                             group new { f, s, m} by new {f.Nombre} into c

                             select new { c.Key.Nombre};

     

     

                return View(query2.ToList());

            } 

    pero cuando ejecuto la aplicación me da el siguiente error:

    "the model item passed into the dictionary is of type 'System.Collections.Generic.List`1[<>f__AnonymousType6`1[System.String]]', but this dictionary requires a model item of type 'System.Collections.Generic.IEnumerable`1[EXSAM.WebRole.Models.Fabricantes]'."

    quisiera saber si ¿estoy haciendo mal la consulta en linq? o ¿me falta algo dentro de la consulta? 

    agradezco su colaboración

    Cordial saludo.

    jueves, 19 de enero de 2012 21:43

Todas las respuestas

  • hola

    lo primero que veria es de asegurar que recuperas un id de empresa correcto

      int? idempresa= (from e in db.UsuarioEmpresa

                                  where e.UserId == user

                                  select e.IdEmpresa).FirstOrDefault();

    if(!idempresa.HasValue){

        return;

    }

     

     

    ademas esta parte

     group new { f, s, m} by new {f.Nombre} into c

    me generar ruido, no creo que haga falta agrupar para evitar repetidos

    prueba de quitar en primer momento el group para ver como reacciona la query

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina
    viernes, 20 de enero de 2012 5:56
  • Hola Miguel,

    El error que tienes es a causa del select que tienes al final del query. Te devuelve una lista de objetos de un tipo anonimo con una propiedad de tipo String. Cuando MVC genera el View espera una coleccion de objetos que coinciden con su Model. Es decir en este caso, espera una lista de Fabricantes, no una lista de nombres.

    Ademas, puedes combinar los dos queries en 1, y como indica Leandro, yo utilizaria Distinct() en vez de group by en este caso, aun que el group by te puede dar los mismos resultados. Pero en vez de agroupar por "new { f.Nombre}" haz de agrupar por "f".

    El siguiente es el query con el distinct:

                var query = from f in db.Fabricantes
    
                             join s in db.Software on f.Id equals s.Id_Fabricante
    
                             join m in db.Empresas on s.Id_empresa equals m.Id
    
                             join e in db.UsuarioEmpresa on m.Id equals e.IdEmpresa
    
                            where e.UserId == user
    
                             select f;
     
    
                return View(query.Distinct().ToList());
    


    Saludos,

    Tyler

    lunes, 30 de enero de 2012 2:18