实体框架数据库调用的未使用结果

本文关键字:未使用 结果 调用 框架 数据库 实体 | 更新日期: 2023-09-27 17:53:35

任何优秀的编译器都应该至少在一定程度上消除死代码。然而,我很好奇编译器(特别是MSBuild)是如何处理如下情况的:

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

LazyLoadingEnabled = false开始,编译后的代码:

  1. 从数据库调用中急切加载结果

  2. 调用数据库而不存储结果

  3. 一开始就不打这个电话?

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

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

实体框架数据库调用的未使用结果

答案是#1。

这不仅会执行数据库查询以选择Users表中的所有记录,而且还会获取所有这些记录并为Users表中的每条记录构建实体。如果你有很多唱片,那很贵。当然,GC最终会收集浪费的资源。

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

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

BTW, LazyLoadingEnabled设置对观察到的行为没有影响。LazyLoadingEnabled设置决定导航属性是否被急切加载。在这个例子中,db.Users不是一个导航属性,所以它没有作用。