无法在LINQ to Entities查询中构造实体或复杂类型“StudentModel.Students”

时间:2016-06-10 06:17:59

标签: c# asp.net entity-framework linq asp.net-web-api

我有一个Asp.net Web API项目。

这是我的控制器:

public IEnumerable<Students> GetBasicInfo()
{
    var students = db.Students.Include("Courses").Select(p => new Students
    {
        student_id = p.student_id,
        student_number = p.student_number,
        first_name = p.first_name,
        middle_name = p.middle_name,
        last_name = p.last_name,
        display_name = p.display_name,
        address = p.address,
        birthdate = p.birthdate,
        contact_number = p.contact_number,
        email = p.email,
        student_img = p.student_img,
        courses = p.courses.Select(a => new Courses
        {
            course_id = a.course_id,
            name = a.name
        })
    }).ToList();

    return students;
}

这是我的模特

Students.cs

public partial class Students
{
    public System.Guid student_id { get; set; }
    public string student_number { get; set; }
    public string first_name { get; set; }
    public string middle_name { get; set; }
    public string last_name { get; set; }
    public string display_name { get; set; }
    public string address { get; set; }
    public System.DateTime birthdate { get; set; }
    public Nullable<int> course_id { get; set; }
    public string contact_number { get; set; }
    public string email { get; set; }
    public byte[] student_img { get; set; }

    public IEnumerable<Courses> courses { get; set; }
}

这是Courses.cs

public partial class Courses
{
    public int course_id { get; set; }
    public string name { get; set; }
}

然而,它返回一个错误,表示

  

'实体或复杂类型'StudentModel.Studentss'不能   在LINQ to Entities查询中构造。'。

知道为什么吗?

1 个答案:

答案 0 :(得分:0)

为什么选择一个实体?

 var students = db.Students.Include("Courses").ToList();

如果您使用此选项只是为了拥有一个分离的标识符,您可以在使用之前附加.AsNoTracking()或禁用DzyConoctor选项中的LazyLoading和代理可观察的构造。

如果您需要修改它,可以使用动态:

var students = db.Students.Include("Courses").Select(p => new { /* ... */ }).ToList().Select(p => new Student { /* ... */ }).ToList();

另外,您可以使用Automapper来避免此代码,并在您的实体模型StudentDTO与您的业务(或视图模型)Student类之间创建关联,该关联将映射名为similar的每个属性。如果你需要映射两个相似的类,你可以改变model.tt来创建一个镜面分离的类并将它们映射到一起。

在使用之前转换数据的另一种方法是extension .Project()in,它允许在将字段放入内存之前过滤字段,。