【发布时间】: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