第一篇为大家带来新的API,DbSet<>.Find()。
过去我们常常用Where或First(FirstOrDefault)方法来查找对应的实体,比如:
var people = from p in context.People
where p.Name.StartsWith("M")
select u;
var people = context.People.FirstOrDefault(p => p.Name == "Michael");
这样查找的缺点是:即使我们相应的实体已经被ObjectContext缓存,EF还是会去执行数据库访问,而数据库访问是被普遍认为比较耗费性能的。
EF4.1为我们提供了一个新的API: DbSet<>.Find()。它可以帮助我们通过主键来查找对应的实体。并且如果相应的实体已经被ObjectContext缓存,EF会在缓存中直接返回对应的实体,而不会执行数据库访问。
比如我们查找主键PersonID为1的Person实体:
var person = context.People.Find(1);
也可用于联合主键(比如查找主键PersonID=1, PersonName="Michael"的实体):
var person = context.People.Find(1, "Michael");
注意:此处输入联合主键的次序需要按照我们定义改实体类时声明主键的次序。
和之前直接用Where或First的调用不同,Find函数对于刚刚新增的实体也能找到:
using (var context = new MyContext())
{
context.People.Add(new People { PersonID = 100 });
var newPerson = context.People.Find(100);
}