【问题标题】:Improving performance of an Entity Framework linq query提高实体框架 linq 查询的性能
【发布时间】:2016-10-24 10:01:36
【问题描述】:

我们在实体框架中使用视图。当我在 SQL Server 中执行程序视图时,它在 2 秒内快速呈现。我创建了简单的 linq 查询 / lambda 表达式来获取输出或应用程序,但获得最终结果需要 2 多分钟。我不确定相同的视图如何在后端(SQL Server)中快速运​​行,当我通过实体框架使用它时会产生问题。

C#

  this.db.progamview.Where(x =>
                            x.pId== 6&&
                              x.qId== 12
                             && x.RId== 20151
                            && x.cId== 102)

我已尝试设置超时,但仍然无法正常工作。当我们处理大型数据集或如何处理 EF 中检索大型数据集的视图时,我们有哪些方法可以提高 Entity Framework 的性能?

尝试了如下AsNotracking 方法,但没有成功。

this.db.progamview.Where(x => x.pId== 6 && x.qId== 12 && x.RId== 20151 && x.cId== 
102).AsNoTracking();

Version: EF6.1

它返回 18 列。我需要在前端显示所有列。

尝试了以下方法,但仍然为时已晚。即需要 4-5 分钟才能得出结果。

  1. 上下文中的超时属性

  2. AsNotracking方法

下面的客户统计截图

还有其他更好的方法来提高性能吗?

【问题讨论】:

  • sql server 返回多少列多少行?以及传输了多少字节?
  • @fredou 更新问题
  • 您能提供确切的数字吗?您可以发布客户端统计信息的屏幕截图吗? (来自sql管理工作室)
  • 您真的需要将所有 42000 行 x 18 列序列化到托管内存中吗?向用户显示所有数据的用例是什么?考虑在查询中使用带有 Skip(pagesize*pages).Take(pagesize) 等的分页,并在网格中显示用户有意义的数据。
  • 我建议尽可能在 sql server 上进行较重的操作。对于计算,sql server 将提供比将所有内容加载到托管内存然后在内存中执行操作更好的结果。

标签: c# entity-framework linq


【解决方案1】:

您可以在数据库中添加索引。 如果您先使用代码,则可以添加 [Index] 属性。

【讨论】:

  • @Wojtpls 我们正在使用 db first 方法。我们已经创建了视图,只是我们从实体框架调用视图
  • 如果您首先使用数据库,则可以将视图用作表。与链接查询相比,它会给你最好的性能
  • @PankajRawat 我们只使用视图
  • 如果您使用视图,您的查询不应花费额外的时间。你用 sql profiler 检查了吗?
  • @Pankaj 问题只在前端而不是后端。在 Sql server 中它运行得很快
【解决方案2】:

如下图使用AsNoTracking()

this.db.progamview.Where(x => x.pId== 6 && x.qId== 12 && x.RId== 20151 && x.cId== 
102).AsNoTracking();

AsNoTracking()

更新: Performance Considerations for EF 6

【讨论】:

  • 请参阅更新部分。
猜你喜欢
  • 2017-08-13
  • 1970-01-01
  • 1970-01-01
  • 2021-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-09
相关资源
最近更新 更多