需求: 使用EF的情况下,查询部分实体字段,把查询结果自动映射到指定的实体类。
比如实体类这样定义:
//学生实体类
[Table("student")]
public class Student{
//主键,编号
int ID {get;set;}
//名称
public string Name{get;set;}
//年龄
public int Age{get;set;}
}
如果要查询某一位学生是这样写:
//db是数据库上下文实体
var studentList=db.Student.Where(o=>o.ID==x).Frist();
上边这样写是没有问题的,但是如果真实项目中,表的字段比较多,而且我们只需要用到其中几个,查询出需求字段即可,没有必要全部查询,比如我只想获取Name,一般是这样写:
var list=db.Student.Where(o=>x).Select(o=>new{
o.Name
}).ToList();
如果我们想把查询出来的字段直接映射到实体中,我们这样写会报错的:
List<Student> list = db.Student.Where(o =>x).Select(o=>new Student{
Name=o.Name
}).ToList();
报错信息是:
The entity or complex type 'db.Student' cannot be constructed in a LINQ to Entities query.
解决办法 :我们可以再定义一个没有与数据库表映射的实体类:
//新增实体体,直接继承Student,并标记此类不与数据库映射
[NotMapping]
public class Student2:Student{}
最后代码这样写就达到目的了:
List<Student> list = db.Student.Where(o =>x).Select(o=>new Student2{
Name=o.Name
}).ToList();