"N + 1选择问题"通常被称为对象关系映射(ORM)讨论中的一个问题,我理解它必须为对象中看起来很简单的事情做出大量的数据库查询.世界.
有没有人对这个问题有更详细的解释?
我做了一个小测试,启用惰性loading.optionsBuilder.UseLazyLoadingProxies().UseSqlServer(ConnectionString);
(使用 EF Core 2.1.4)
我循环浏览有和没有的仪器,这是我得到的结果
情况1
var instruments = db.instruments.OrderBy(t=>t.id).Include(t=>t.NavPro1).ThenInclude(t=>t.NavPro2).Take(200);
Run Code Online (Sandbox Code Playgroud)
案例2
var instruments = db.instruments.OrderBy(t=>t.id).Include(t=>t.NavPro1).ThenInclude(t=>t.NavPro2).Take(200);
Run Code Online (Sandbox Code Playgroud)
然后
foreach (var i in instruments)
{
var props = i.NavPro1;
foreach (var prop in props)
{
sbPrintGreeks.AppendLine(prop.NavPro2.Name + " - " + prop.id + " - " + prop.Value);
}
}
Run Code Online (Sandbox Code Playgroud)
无需延迟加载,只需 7 秒即可获取 100k 行
使用延迟加载需要 160 秒才能获取 3k 行。
可以做些什么来获得良好的性能?
这个问题不是关于 c# 一般的“使用”,而不是关于何时/为什么使用它等等。
问题是,DBContext 对象是否自己处理连接,因此我不需要使用using它来处理它,没有关于它的问题,所以不要将其标记为重复
using (DBContext db = new DBContext())
{
var Order = db.Order.First(r => r.OrderID == 6);
Order.Type = 6;
db.SaveChanges();
}
Run Code Online (Sandbox Code Playgroud)
或者不使用
DBContext db = new DBContext();
var Order = db.Order.First(r => r.OrderID == 6);
Order.Type = 6;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)
因为我在这个来源中看到using没有必要,最好不要使用它。
实体框架会为我处理连接吗?