none
Error: The entity or complex type 'SchoolModel.Persons' cannot be constructed in a LINQ to Entities query. RRS feed

  • Pregunta

  • Saludos comunidad tengo el siguiente problema:

    Estoy realizando una aplicacion con capas en Asp .Net Web Forms, C#, EF 6.1.2, tengo:

    Clase POCO Persons:

    //------------------------------------------------------------------------------
    // <auto-generated>
    //     Este código se generó a partir de una plantilla.
    //
    //     Los cambios manuales en este archivo pueden causar un comportamiento inesperado de la aplicación.
    //     Los cambios manuales en este archivo se sobrescribirán si se regenera el código.
    // </auto-generated>
    //------------------------------------------------------------------------------
    
    namespace Entidades
    {
        using System;
        using System.Collections.Generic;
        
        public partial class Persons
        {
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2214:DoNotCallOverridableMethodsInConstructors")]
            public Persons()
            {
                this.StudentGrade = new HashSet<StudentGrades>();
                this.Course = new HashSet<Courses>();
            }
        
            public int PersonID { get; set; }
            public string LastName { get; set; }
            public string FirstName { get; set; }
            public Nullable<System.DateTime> HireDate { get; set; }
            public Nullable<System.DateTime> EnrollmentDate { get; set; }
        
            public virtual OfficeAssignments OfficeAssignment { get; set; }
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<StudentGrades> StudentGrade { get; set; }
            [System.Diagnostics.CodeAnalysis.SuppressMessage("Microsoft.Usage", "CA2227:CollectionPropertiesShouldBeReadOnly")]
            public virtual ICollection<Courses> Course { get; set; }
        }
    }


    Clase PersonsDAL de la capa de Acceso a Datos:

    public List<Persons> DevuelveEstudiantes()
            {
                using(SchoolEntities db = new SchoolEntities()) 
                {
                    var query = from Est in db.Persons
                                select new Persons 
                                {
                                    LastName = Est.LastName,
                                    FirstName = Est.FirstName,
                                    HireDate = Est.HireDate,
                                    EnrollmentDate = Est.EnrollmentDate
                                };
    
                    return query.ToList();     
                }
            }

    Justo me da error en el return query.ToList(); pero si coloco:

    var query = from Est in db.Persons.ToList()

    Funciona.

    porque no lo se? esta bien la solucion


    • Editado RealMaster miércoles, 21 de enero de 2015 16:48
    miércoles, 21 de enero de 2015 3:05

Todas las respuestas

  • Tiene pinta de ser un problema de espacio de nombres. El error que te sale reporta un problema con "SchoolModel.Persons", pero la clase que quieres construir, según tu código fuente, es "Entidades.Persons". Seguramente tienes al principio un "using SchoolModel" y cuando pones el "select new Persons..." te está interpretando "select new SchoolModel.Persons". Cámbialo por "select new Entidades.Persons" (y lo mismo en el List<>) y mira a ver si así funciona.
    • Propuesto como respuesta webJose miércoles, 21 de enero de 2015 15:46
    • Votado como útil RealMaster miércoles, 21 de enero de 2015 17:23
    miércoles, 21 de enero de 2015 9:57
  • Gracias por la respuesta Alberto:

    En la capa de Acceso a Datos tengo lo siguiente en forma completa:

    using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using Entidades; //Capa Entidades namespace AccesoDatos { public class PersonsDAL { public List<Persons> DevuelveEstudiantes() { using(SchoolEntities db = new SchoolEntities()) { var query = from Est in db.Persons select new Persons { PersonID = Est.PersonID, LastName = Est.LastName, FirstName = Est.FirstName, HireDate = Est.HireDate, EnrollmentDate = Est.EnrollmentDate };

    return query.ToList(); } } } }

    Lo que tu me aconsejas ya lo hice,la unica forma en que funciona es de esta manera:

    var query = from Est in db.Persons.ToList()

    y nose porque se le debe colocar ToList a db.Persons

    Ahora si coloco este tipo de consulta linq, sin colocar ToList a db.Persons, funciona:

    public List<Persons> DevuelveEstudiantes()
            {
                using(SchoolEntities db = new SchoolEntities())
                {
                    var query = from Est in db.Persons
                                select Est;
                    return query.ToList();     
                }
            }

    En que momento debo usar Tolist en db.Persons y en que momento no, no lo se.

    Saludos


    • Editado RealMaster miércoles, 21 de enero de 2015 17:16
    miércoles, 21 de enero de 2015 16:47
  • hola

    pero esa clase Persons que estas usando en el linq cuando haces

    select new Persons

    es la misma que usas en el db.Persons ?

    porque si vas a asignar solo algunas propiedades deberias crear otra clase como ser

    public class PersonInfo
    {
    	public int PersonID { get; set; }
    	public string LastName { get; set; }
    	public string FirstName { get; set; }
    	public DateTime HireDate { get; set; }
    	public DateTime EnrollmentDate { get; set; }
    }

    entonces defines

    public List<PersonInfo> DevuelveEstudiantes()
    {
    	using(SchoolEntities db = new SchoolEntities()) 
    	{
    		var query = from Est in db.Persons
    					select new PersonInfo()
    					{
    						PersonID = Est.PersonID,
    						LastName = Est.LastName,
    						FirstName = Est.FirstName,
    						HireDate = Est.HireDate,
    						EnrollmentDate = Est.EnrollmentDate
    					};
    
    		return query.ToList();     
    	}
    }

    como veras conviertes a esa clase y la retornas

    saludos


    Leandro Tuttini

    Blog
    MVP Profile
    Buenos Aires
    Argentina

    miércoles, 21 de enero de 2015 17:11
  • hola

    pero esa clase Persons que estas usando en el linq cuando haces

    select new Persons

    es la misma que usas en el db.Persons ?

    Hola Leandro,

    Si es la misma clase, tendria que crear otra clase auxiliar para obtener digamos 2 propiedades LastName y FirstName, pero si ya las tengo en la clase POCO Persons, porque habria que repetir codigo y crear otra clase auxiliar.



    • Editado RealMaster miércoles, 21 de enero de 2015 17:23
    miércoles, 21 de enero de 2015 17:23
  • En que momento debo usar Tolist en db.Persons y en que momento no, no lo se.

    Cuando pones el .ToList() detrás de la consulta, lo que hace es que en ese momento construye un "select * from laTabla" y lo envía al servidor, y el resultado lo guarda en un List<Persons> en memoria. Si a partir de ahí continúas poniéndole condiciones a la consulta, las resuelve mediante linq-to-objects en memoria (en lugar de resolverlas mediante linq-to-entities convirtiéndolas en una query contra la base de datos).

    Esa clase Persons que te llega en el List<Persons> es la misma que se ha usado para definir el DbSet<Persons> al que estás accediendo cuando llamas al db.Persons. Lo matizo por si tienes más de una clase Persons en distintos espacios de nombres.

    miércoles, 21 de enero de 2015 17:54