实体框架正在构建一个不到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,
... {其他属性相同}
答案 0 :(得分:0)
你申请传呼吗? (我的意思是跳过和拍摄)最重要的是使用ToList()的地方? 我们有完全相同的问题,解决方法是在DTO构造之后使用ToList()。
答案 1 :(得分:0)
尝试在结果对象上使用.ToList()。这就是我们所做的一切。我同意这没有道理。显然IEnumerable<>不是一件幸福的事情