【问题标题】:Entity Framework mapping to DTO too slow实体框架映射到 DTO 太慢
【发布时间】:2015-06-15 19:05:40
【问题描述】:

Entity Framework 正在构建一个不到 2 秒的 SQL 查询。即使查询很丑陋,它也很快。在 EF SELECT 语句中,我正在基于我的实体构建一个 DTO。 DTO 有大约 20 个属性,而且很简单。因此,EF 正在运行一个返回我需要的这 20 个属性的查询。一切似乎都很好,但构建 DTO 需要将近 10 秒。我已经告诉 EF 不要跟踪更改(数据库集上的 AsNoTracking()),所以我不确定在执行查询和构建 DTO 之间发生了什么。

EF 在幕后做了什么让它这么慢?同样,查询很好并且返回非常快,但是使用这些属性构建 DTO 非常慢。

我用一个返回相同 20 个属性的存储过程替换了这个逻辑,它真的非常快。 DTO 是相同的,因此在读取查询结果和构建不同的 DTO 之间必须有中间的东西。

我希望有人能帮我弄清楚发生了什么。

编辑:

我正在添加基于评论填充 DTO 的方式。

.Select(p => new PMPanelOffersDTO()
                                {
                                    OfferId = p.Id,
                                    OfferDate = p.DateCreated,
                                    UserId = p.UserId,
                                    OfferAmountId = p.AmountId,
                                    OfferAmountTypeId = p.Amount != null ? p.Amount.OfferType.Id : default(int?),
                                    OfferAmountType = p.Amount != null ? p.Amount.OfferType.Name : null,
                                    TowerCompanyName = p.Amount != null && p.Amount.Tower != null ? p.Amount.Tower.CompanyName : null,

... {其他属性相同}

【问题讨论】:

  • 你能显示填充你的 dto 的代码吗?
  • 我刚刚添加了几行代码来描述我如何填充 DTO。
  • 配置应用程序并发布配置文件。或者,暂停调试器 10 次。什么代码最常运行?
  • 开始从 dto 对象初始化器中删除属性。看看是不是这些问题。
  • 我确认问题不在于任何特定属性。我的项目中没有集成 EF 源代码,因此我无法分析 EF 引擎盖下发生的事情。

标签: performance entity-framework dto


【解决方案1】:

你应用分页吗? (我的意思是skip&take)最重要的是,ToList() 到底在哪里使用? 我们有完全相同的问题,通过在 DTO 构建后使用 ToList() 的方式解决。

【讨论】:

  • 我们不为这个页面使用分页,因为我们需要在没有分页的情况下显示所有信息,这是业务需求。 ToList() 在下面应用了几行代码,但这不应该有任何区别,因为在您调用 ToList() 之前不会执行查询(这是因为 EF 使用延迟执行)。我们构建 DTO,应用排序,然后在 3 行不同的代码中调用 ToList()。我们返回了大约 1,500 个 DTO 对象,它不应该花费 7 秒。建造它们。切换到 SP 后,只需不到 1 秒。使用 EF 构建 DTO。
【解决方案2】:

尝试在结果对象上使用 .ToList()。这就是我们的案例。我同意这没有任何意义。显然 IEnumerable 不是一件快乐的事情

【讨论】:

  • 如果您在构建 DTO 之前执行 ToList(),您将检索到很多您不需要的数据。
猜你喜欢
  • 2018-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-03
  • 1970-01-01
  • 2010-10-09
  • 2021-10-28
相关资源
最近更新 更多