我有一个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查询中构造。'。
知道为什么吗?
答案 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,它允许在将字段放入内存之前过滤字段,。