这边分享一下,提升ADO.Net Entity Framework执行速度的几个方法,
技巧一 取得单一数据时,可利用【GetObjectByKey】
在预设中,ObjectContext 在查询数据的时候,并不会以快取对象作为优先查询,
会在每次查询时都向数据库要数据,对效能会产生一定的影响,
因此可以利用【GetObjectByKey】方法来对快取对象进行查询,
但如果使用【GetObejctByKey】方法进行查询,而快取对象又不存在时,
会发生 ObjectNotFoundException 例外,
要避免此问题可利用【TryGetObejctByKey】方法,
如果在快取对象中找不到数据时,会回传 false,
1 2 3 4 5 6 7 8 9 10 |
////示范一 TryGetObjectByKey using (TestEntities te = new TestEntities()) { object entity; EntityKey key = new EntityKey("TestEntities.User", "User_id", 1); te.TryGetObjectByKey(key, out entity); ////使用 entity 对象 ////.... } |
技巧二 重复执行相同查询语法,可利用已编译查询【CompiledQuery】
在我们每次下达 Linq to Entities 向数据库查询数据时,
会先编译成 Entity SQL Language ,再经由 Provider 转换成对应该数据库的语法,
如果我们在循环里,对同一个查询下达1000次的话,就要经过1000次的转换,
这是很浪费效能的,
因此 ADO.Net Entity Framework 提供了 CompiledQuery 类别,
可以进行查询的编译和快取以供重复使用,
这边简单看一个范例
1 2 3 4 5 |
/// <summary> /// 已编译查询 /// </summary> private static readonly Func<TestEntities, int ,User> CompiledQueryGetUserById = CompiledQuery.Compile<TestEntities, int, User>((te, id) => te.User.Where(a=>a.User_id == id).FirstOrDefault()); |
1 2 3 4 5 6 |
////示范二 CompiledQuery using (TestEntities te = new TestEntities()) { //// 利用 CompiledQuery 取得数据 User u = CompiledQueryGetUserById.Invoke(te, 1); } |
技巧三 只进行查询,而不异动数据时 可利用【MergeOption.NoTracking】
使用【MergeOption.NoTracking】时,
因为不会再 ObjectStateManager 中追踪对象异动状态,
因此查询时效能较好,(系统默认是使用【MergeOption.AppendOnly】)
范例
1 2 3 4 5 |
////示范三 MergeOption.NoTracking using (TestEntities te = new TestEntities()) { User u = te.User.Execute(MergeOption.NoTracking).Where(a => a.User_id == 1).FirstOrDefault(); } |
参考连结
CompiledQuery 类别
已编译的查询 (LINQ to Entities)
MergeOption 列举型别
ObjectStateManager
ObjectContext..::.TryGetObjectByKey 方法