Entity Framework 数据库调用未使用的结果
Unused results from Entity Framework database call
任何体面的编译器都应该 eliminate dead code,至少在一定程度上。但是,我很好奇编译器(特别是 MSBuild)如何处理如下情况:
// let's assume LazyLoadingEnabled = false;
var users = db.Users.ToList();
// more code that never touches 'users'
由于LazyLoadingEnabled = false
,将编译后的代码:
提前加载数据库调用的结果
调用数据库而不存储结果
或
从不拨打电话?
我在清理工作中的一些旧代码时发现了好几起这种情况,所以我很好奇我们是否一直在浪费资源。
感觉正确答案是数字 3,但我还没有找到任何确凿的证据来支持我的说法。感谢您的帮助!
答案是#1。
这不仅会对 select Users
table 中的所有记录执行数据库查询,而且还会获取所有这些记录并为每个记录构造实体在 Users
table 中。如果您有很多记录,则非常昂贵。当然,GC最终还是会把浪费的资源收起来的。
如果您想自己证明以上内容,只需在创建 DbContext
后添加以下行以记录正在执行的 SQL:
db.Database.Log = s => Console.WriteLine(s);
顺便说一句,LazyLoadingEnabled
设置对观察到的行为没有影响。 LazyLoadingEnabled
设置决定是否预先加载导航属性。在这种情况下,db.Users
不是导航 属性,因此它没有任何效果。
任何体面的编译器都应该 eliminate dead code,至少在一定程度上。但是,我很好奇编译器(特别是 MSBuild)如何处理如下情况:
// let's assume LazyLoadingEnabled = false;
var users = db.Users.ToList();
// more code that never touches 'users'
由于LazyLoadingEnabled = false
,将编译后的代码:
提前加载数据库调用的结果
调用数据库而不存储结果
或
从不拨打电话?
我在清理工作中的一些旧代码时发现了好几起这种情况,所以我很好奇我们是否一直在浪费资源。
感觉正确答案是数字 3,但我还没有找到任何确凿的证据来支持我的说法。感谢您的帮助!
答案是#1。
这不仅会对 select Users
table 中的所有记录执行数据库查询,而且还会获取所有这些记录并为每个记录构造实体在 Users
table 中。如果您有很多记录,则非常昂贵。当然,GC最终还是会把浪费的资源收起来的。
如果您想自己证明以上内容,只需在创建 DbContext
后添加以下行以记录正在执行的 SQL:
db.Database.Log = s => Console.WriteLine(s);
顺便说一句,LazyLoadingEnabled
设置对观察到的行为没有影响。 LazyLoadingEnabled
设置决定是否预先加载导航属性。在这种情况下,db.Users
不是导航 属性,因此它没有任何效果。