Entity Framework数据库调用中未使用的结果

时间:2015-06-04 23:03:34

标签: c# entity-framework msbuild dbcontext compiler-optimization

任何体面的编译器都应该eliminate dead code,至少在一定程度上。但是,我很好奇编译器(特别是MSBuild)如何处理如下情况:

// let's assume LazyLoadingEnabled = false;
var users = db.Users.ToList();
// more code that never touches 'users'

LazyLoadingEnabled = false起,编译代码将是:

  1. 急切加载数据库调用的结果
  2. 在不存储结果的情况下调用数据库

  3. 永远不要打电话开始?

  4. 我正在清理工作中的一些旧代码,我发现了几个这样的情况,所以我很好奇我们是否一直在浪费资源。

    感觉正确的答案是3号,但我没有找到任何可靠的证据来支持我的说法。谢谢你的帮助!

1 个答案:

答案 0 :(得分:1)

答案是#1。

这不仅会执行数据库查询以选择Users表中的所有记录,而且还会为Users表中的每个记录获取所有这些记录并构造实体。如果您有很多记录,则非常昂贵。当然,GC最终将收集浪费的资源。

如果您想自己证明以上内容,请在创建DbContext后添加以下行以记录正在执行的SQL:

db.Database.Log = s => Console.WriteLine(s);

BTW,LazyLoadingEnabled设置对观察到的行为没有影响。 LazyLoadingEnabled设置确定是否急切加载导航属性。在这种情况下,db.Users不是导航属性,因此它没有效果。