【问题标题】:EF6 takes time to fetch resultsEF6 需要时间来获取结果
【发布时间】:2016-06-20 09:32:32
【问题描述】:

我们使用带有存储库模式的 EF6 来处理数据库数据,并使用 LINQ 来取回数据。 EF 生成的查询在 SSMS 中在 100-120 秒内获取大约 164,000 条记录,并将结果映射回 C# 对象。如果我记录执行所花费的时间,那么将结果具体化为 C# 对象似乎需要时间。以下是 EF 中查询执行的日志详细信息-

在 2016 年 6 月 20 日下午 2:47:04 +05:30 异步打开连接 -- 在 6/20/2016 2:47:04 PM +05:30 异步执行 -- 在 8730 毫秒内完成,结果:SqlDataReader 我的问题是 - 为什么 EF 需要时间将结果映射回 C# 对象。

更多细节-

_fundRepository.GetAllIncluding(f => f.Funds.Select(l => l.Location),
                    f => f.Brand).Select(f => new
//properties selection from above entities
.
.
.
);

Fund 实体里面有很多对象.. Fund 及其子产品如前所述计数在 164000 左右

【问题讨论】:

  • 为什么需要实现 164 000 条记录?向最终用户显示如此多的记录没有意义......也许您需要某种分页?
  • 你在构建整个对象树吗?运行一个构造函数可能需要 20-40 毫秒,尤其是在它有很多子对象的情况下。 EF不是为了速度,而是为了好用。优化您的代码以获得更好的性能。
  • 不,我没有在 UI 上显示它。我将此结果作为导出提供给用户。感谢您的回复。
  • @Dexion - 我尝试用 SP 替换代码,它看起来有一些改进。但是,我想知道从实体框架调用时将查询结果绑定到 C# 对象/实体的过程是如何发生的。我尝试在谷歌上搜索,但我没有得到它。
  • 调试代码并在 EF 调用时停止调试器。您将看到一些具有生成名称的运行时生成的类。顺便说一句,这里是源代码:entityframework.codeplex.com/SourceControl/latest

标签: c# linq entity-framework-6 entity


【解决方案1】:

你可以使用任务来提高查询的性能,比如

Task.Run(()=>_fundRepository.GetAllIncluding(f => f.Funds.Select(l => l.Location),
                    f => f.Brand).Select(f => new
//properties selection from above entities
.
.
.
));

Improve query performance

【讨论】:

  • 那应该如何提高性能?您在另一个线程中执行请求这一事实不会影响 imo 的性能。
  • 是的,我的意思是处理时间会更少
  • 为什么要少?执行请求的时间应该完全相同,唯一的好处是 - 您在等待时没有阻塞 UI 线程,因此 GUI 不会冻结。但它无论如何都不能回答 OP 问题。
【解决方案2】:

如果这是一个只读操作,将 AsNoTracking 放入请求中可能会提高性能,尤其是在检索到大量记录的情况下。

它很可能需要进入您的 GetAllIncluding 方法。

https://msdn.microsoft.com/en-us/data/jj556203.aspx

和此处的第 5.1.1 节: https://msdn.microsoft.com/en-us/data/hh949853.aspx#5

【讨论】:

  • 谢谢埃里克。我之前尝试过,但是我没有得到任何改善。
猜你喜欢
  • 2021-03-05
  • 1970-01-01
  • 2019-11-01
  • 2018-07-22
  • 1970-01-01
  • 1970-01-01
  • 2021-05-22
  • 2019-01-07
  • 1970-01-01
相关资源
最近更新 更多