【问题标题】:The entity or complex type 'StudentModel.Students' cannot be constructed in a LINQ to Entities query无法在 LINQ to Entities 查询中构造实体或复杂类型“StudentModel.Students”
【发布时间】:2016-10-11 00:04:58
【问题描述】:

我有一个项目,它是一个 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 查询中构造。'。

知道为什么吗?

【问题讨论】:

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


【解决方案1】:

为什么选择实体?

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

如果您使用此选项只是为了获得一个分离的同名,您可以在使用之前附加 .AsNoTracking() 或在 DbContext 选项中禁用 LazyLoading 和代理 observable 构造。

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

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

否则,您可以使用Automapper 来避免此代码,并在您的实体模型 StudentDTO 和您的业务(或视图模型)Student 类之间创建关联,这将映射每个名称相似的属性。如果您需要映射两个相似的类,您可以更改 model.tt 以创建镜面分离类并将其映射在一起。

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

【讨论】:

  • var students = db.Students.Include("Courses").Select(p =&gt; new { /* ... */ }).ToList().Select(p =&gt; new Student { /* ... */ }).ToList(); 的第一个 Select 中应该包含哪些属性?
  • 您创建了一个动态临时类,其中包含您想从 sql 中选择的所有属性。您不能进行复杂的操作,因为它们必须可以通过 EF IQueryable 在 sql 中进行转换。可能您想从 Student 中选择所有属性,以便在真正的 Student 类中重新绑定它们。这个解决方案不是一个好的解决方案,因为它容易出错。您手动编写两次每个属性关联。在这种情况下,还有一个嵌套项目列表要复制。我认为使用 Automapper 并在 model.tt 中生成两个相同的类更有趣
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-31
  • 2015-02-06
  • 1970-01-01
  • 2023-03-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多