实体框架映射到DTO的速度太慢

时间:2015-06-15 19:05:40

标签: performance entity-framework dto

实体框架正在构建一个不到2秒的SQL查询。即使查询很丑陋,但速度很快。在EF SELECT语句中我正在建立一个基于我的entites的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,

... {其他属性相同}

2 个答案:

答案 0 :(得分:0)

你申请传呼吗? (我的意思是跳过和拍摄)最重要的是使用ToList()的地方? 我们有完全相同的问题,解决方法是在DTO构造之后使用ToList()。

答案 1 :(得分:0)

尝试在结果对象上使用.ToList()。这就是我们所做的一切。我同意这没有道理。显然IEnumerable<>不是一件幸福的事情