每个开发人员都应该知道的ADO.NET实体框架性能提示

Buu*_*yen 10 .net ado.net entity-framework

每个ADO.NET EF开发人员应该了解哪些性能提示?

请将每个提示放在每个答案中并解释为什么提示是好的(例如通过最小化DB往返).

Buu*_*yen 9

用于ObjectContext#GetObjectByKey()通过键检索实体,而不是在LINQ查询中使用First()(或FirstOrDefault)运算符.后者将每次都访问数据库,而前者将首先搜索ObjectStateManager实体的EF缓存(具体),如果找到具有指定密钥的实体,则不会访问数据库.

参考


Buu*_*yen 8

我在分析应用程序中使用的EF代码生成的SQL时刚刚学到的东西:两者之间存在差异:

IEnumerable<User> users = DB.User.Where(...);
int count = users.Count();
Run Code Online (Sandbox Code Playgroud)

IQueryable<User> users = DB.User.Where(...);
int count = users.Count();
Run Code Online (Sandbox Code Playgroud)

前者生成完整查询以从User表中检索匹配的行,并在数据传输回EF后完成计数.后者执行通常所期望的:生成SELECT COUNT ...SQL,效率更高.

这是非常微妙但不难理解为什么在注意到它之后:它是由于C#扩展方法的静态绑定性质.

解决这个问题的一个小技巧是使用"var"关键字来声明变量:

var users = DB.users.Where(...);
int count = users.Count();
Run Code Online (Sandbox Code Playgroud)

这将导致"users"被声明为".Where"返回的相同类型; 这是一个IQueryable <>.