我从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;
}
为了弄清这个问题的原因,我启动了我的分析器。这是我发现的:
![trace](https://istack.dev59.com/BVmMt.webp)
.Find()
调用期间会花费如此之长的时间,而不是在显式 .SingleOrDefault
调用期间(请注意,在调用堆栈的顶部附近,它实际上正在准备一个 SingleOrDefault
调用)?有没有办法看到 .Find()
方法实际上正在尝试编译的查询?