【问题标题】:Performance problems using entity framework 5 with large resultset使用具有大型结果集的实体框架 5 的性能问题
【发布时间】:2013-11-23 18:52:14
【问题描述】:

我正在使用 Entity Framework 5,我正在执行一个查询,该查询返回一个相对较大的结果集,大约 30,000 行。查询本身执行速度非常快,只需要大约 700 毫秒。

构建 linq 查询后,我调用query.Load();,然后将DataContext.Set<MyType>.Local 作为ObservableCollection 返回给调用者。结果显示在可编辑的网格中。

问题在于query.Load(); 调用 - 大约需要 60 秒,这太长了。我猜测这是 EF 将结果转换为 .NET 对象的地方?我试过分析,但它不会比IQueryable.Load 更深入:/

有什么想法可以提高性能吗?

顺便说一句,我尝试升级到 EF6 看看是否有帮助,但实际上情况变得更糟,query.Load(); 通常需要 100 秒!

【问题讨论】:

  • 为什么要将 30k 行加载到 DataGrid 中?用户查看这么多行的目的是什么?网格不能分页吗?
  • 我知道,我知道...我们已经在应用程序中进行了分页,并且没有性能问题。但用户不喜欢它——他们想一次查看所有行。没有内存问题,并且由于 UI 虚拟化,网格也没有问题。只用 EF :/
  • 如果用户不喜欢分页,您可以加载 200 个实体,当用户滚动到网格末尾时,您可以加载接下来的 200 个连续实体。所以你让用户看不到真正的分页(比如下一页/上一页),你可以加载更少的数据。
  • @xxMUROxx 问题是 EF 当前存在物化问题(请参阅:entityframework.codeplex.com/workitem/1781)。当您获取大量行时它更明显,但当您获取小集合时它同样存在。

标签: c# .net performance entity-framework entity-framework-5


【解决方案1】:

在需要结果之前,不会执行 Linq to Entities 查询。这就是“支付”计算成本的时候。在那之前,查询只是一个查询。正如 Stefan 建议的那样,您应该尝试添加一些过滤器,或者至少使用 .Skip 和 .Take 方法添加分页机制。

您也可以查看this MSDN 关于 linq 分页的文章。

希望我能帮上忙!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-11-29
    • 2016-03-09
    • 2011-11-16
    • 2018-08-02
    相关资源
    最近更新 更多