我从 DbSet.Find() 调用中得到了糟糕的表现。我的代码如下所示:
public class Area
{
[Key]
public string Id { get; protected set; }
// ...
}
public class MyContext : DbContext
{
//...
public DbSet<Area> Areas { get; set; }
//...
}
// This is the call that takes so long
Area area = context.Areas.Find(id);
我知道这必须搜索实体集,检查更改跟踪等,并将触发对数据库的调用。问题是它比简单的context.Areas.SingleOrDefault(x => x.Id == id)
调用要长几个数量级。比我认为合理的要多得多。根据另一个问题的提示,我还尝试暂时关闭更改跟踪但没有成功(它似乎没有任何效果):
try
{
context.Configuration.AutoDetectChangesEnabled = false;
return context.Areas.Find(id);
}
finally
{
context.Configuration.AutoDetectChangesEnabled = true;
}
为了试图弄清楚这一点,我启动了我的分析器。这是我发现的:
看起来它一直在花时间准备一个执行计划。但是为什么在调用过程中需要这么长时间.Find()
而不是显式.SingleOrDefault
调用(请注意,在调用堆栈的顶部附近,它实际上正在准备SingleOrDefault
调用)。有什么方法可以查看该.Find()
方法实际尝试编译的查询?