【发布时间】:2017-08-27 17:02:56
【问题描述】:
我一直在尝试制作自己的实体框架(用于个人项目并且出于对制作这样的东西需要什么的好奇)。
当我使用包含 700k 行和 5 列的数据表(名为 MassData)进行 Entity Framework 性能测试时,我遇到了一些特殊的问题,希望有人能向我解释。
运行以下测试:
var Context = new EntityFameworkContext();
var first = Context.MassData.Where(x => x.Id == 1);
var firstFifty = Context.MassData.Where(x => x.Id < 50).ToArray();
上下文创建需要 35 毫秒,获取 first 大约需要 215 毫秒,获取 firstFifty 需要 14 毫秒。
删除'first',得到'firstFifty'大约需要210ms。
如果我将'first' 查询切换为选择所有内容的Where(),结果是相同的(仍然没有迭代)。
我的第一个想法是,这是在 DbSet 中加载惰性数据的某种情况,第一个查询枚举下一个访问的数据(即使第一个查询没有遍历任何内容)。这可以解释为什么无论查询如何,第一个总是至少需要 200 毫秒,而第二个运行速度就像没有数据库连接一样快(“firstFifty”作为 SQL 查询运行至少需要 25 毫秒,超过我在这里看到的 15 毫秒)。
除了加载所有 MassData 需要 5 秒。只需阅读它大约需要2,5。因此它不能加载所有内容,但显然加载的内容超出了第一个查询所需的内容。所以很明显我错过了一些东西。
有人能解释一下为什么
var first = Context.MassData.Where(x => x.Id == 1);
查询加快了
var firstFifty = Context.MassData.Where(x => x.Id < 50).ToArray();
查询?
编辑:
事实证明,这与延迟加载完全无关。第一个查询打开连接,并且(我认为)执行并存储针对数据库表的实体类型的验证。然后第二个查询不必打开连接或做任何验证,在这种情况下,第二个查询的持续时间匹配,一切都有意义。
编辑 2:
修改了标题,以更好地匹配问题最终的真正含义(延迟加载如何工作 => 实体加载如何工作)。
【问题讨论】:
-
这与延迟加载无关。
标签: c# sql entity-framework