none
LinQ To Entities definición de alias RRS feed

  • Pregunta

  • Buenas, espero contar con su ayuda, ya que no puedo resolverlo desde ya hace muchos días.

    Utilizo LinQ para recuperar datos desde a base datos, el problema que surge es cuando en la consulta LinQ utilizo alias, para no mostrar los mismos campos de la tabla de la base de datos como encabezado del control DataGridView en una aplicación WinForm. A continuación les muestro una parte del código de mi aplicación.

    Clase POCO:

    public class User
    {
            public int UserId { get; set; }
            public string Nombre { get; set; }
            public string ApellidoPat { get; set; }
            public string ApellidoMat { get; set; }
            public DateTime FechaNac { get; set; }
            public char Sexo { get; set; }
    }

    Método List

    public List<User> List()
    {
                using (context = new CrisofdevContext())
                {
                    var q = from u in context.Users select new User{ UserId = u.UserId, Nombres = u.Nombre, Apellidos = u.ApellidoPat + " " + u.ApellidoMat, FechaNac = u.FechaNac };
                    return q.ToList();
                }
    }

    Errores:

    'Entities.User' does not contain a definition for Nombres

    'Entities.User' does not contain a definition for Apellidos

    miércoles, 15 de enero de 2014 23:03

Todas las respuestas

  • Ya se respondió esta misma pregunta en el foro de Linq. El problema es que en tu sentencia no estás construyendo un tipo anónimo, sino un tipo User. Y el tipo User tiene los campos que tiene; no es lícito ponerle alias a una clase existente. Los alias solo valen para crear las propiedades de la clase cuando la clase se crea sobre la marcha como tipo anónimo.

    En otras palabras, tendrías que omitir la palabra User después del new en la sentencia Linq. Esto sí que te permitiría poner los alias... pero después no podrías hacer "return q.ToList()" porque el tipo de los objetos así generados no coincidiría con el tipo de retorno declarado para la función.

    viernes, 17 de enero de 2014 7:17
  • hola

    es logico que si la clase no define la propiedad se produzca un error

    quizas puedas usar algo como ser

    public List<dynamic> List()
    {
    	using (context = new CrisofdevContext())
    	{
    		var q = from u in context.Users 
    				select new 
    				{ 
    					UserId = u.UserId, 
    					Nombres = u.Nombre, 
    					Apellidos = u.ApellidoPat + " " + u.ApellidoMat, 
    					FechaNac = u.FechaNac 
    				};
    		return q.ToList();
    	}
    }

    con dynamic podrias devolver un objeto para el cual no hayas creado una clase

    recuerda que necesitas .net 4 o superior para usar dynamic

    saludos


    Leandro Tuttini

    Blog
    Buenos Aires
    Argentina

    viernes, 17 de enero de 2014 13:29