Fixes n+1 on ContentRepository.PerformGetAll

This commit is contained in:
Shannon
2014-09-02 16:13:31 +10:00
parent b3b813a649
commit a75f6d2afd

View File

@@ -88,21 +88,17 @@ namespace Umbraco.Core.Persistence.Repositories
protected override IEnumerable<IContent> PerformGetAll(params int[] ids)
{
var sqlClause = GetBaseQuery(false);
if (ids.Any())
{
foreach (var id in ids)
{
yield return Get(id);
}
sqlClause.Where("umbracoNode.id in (@ids)", new {ids = ids});
}
else
{
var nodeDtos = Database.Fetch<NodeDto>("WHERE nodeObjectType = @NodeObjectType", new { NodeObjectType = NodeObjectTypeId });
foreach (var nodeDto in nodeDtos)
{
yield return Get(nodeDto.NodeId);
}
sqlClause.Where<NodeDto>(x => x.NodeObjectType == NodeObjectTypeId);
}
return ProcessQuery(sqlClause);
}
protected override IEnumerable<IContent> PerformGetByQuery(IQuery<IContent> query)
@@ -114,36 +110,7 @@ namespace Umbraco.Core.Persistence.Repositories
.OrderByDescending<ContentVersionDto>(x => x.VersionDate)
.OrderBy<NodeDto>(x => x.SortOrder);
//NOTE: This doesn't allow properties to be part of the query
var dtos = Database.Fetch<DocumentDto, ContentVersionDto, ContentDto, NodeDto>(sql);
//content types
var contentTypes = _contentTypeRepository.GetAll(dtos.Select(x => x.ContentVersionDto.ContentDto.ContentTypeId).ToArray())
.ToArray();
var templates = _templateRepository.GetAll(
dtos
.Where(dto => dto.TemplateId.HasValue && dto.TemplateId.Value > 0)
.Select(x => x.TemplateId.Value).ToArray())
.ToArray();
//Go get the property data for each document
var docDefs = dtos.Select(dto => new Tuple<int, Guid, IContentTypeComposition, DateTime, DateTime>(
dto.NodeId,
dto.VersionId,
contentTypes.First(ct => ct.Id == dto.ContentVersionDto.ContentDto.ContentTypeId),
dto.ContentVersionDto.ContentDto.NodeDto.CreateDate,
dto.ContentVersionDto.VersionDate))
.ToArray();
var propertyData = GetPropertyCollection(docDefs);
return dtos.Select(dto => CreateContentFromDto(
dto,
dto.ContentVersionDto.VersionId,
contentTypes.First(ct => ct.Id == dto.ContentVersionDto.ContentDto.ContentTypeId),
templates.FirstOrDefault(tem => tem.Id == (dto.TemplateId.HasValue ? dto.TemplateId.Value : -1)),
propertyData[dto.NodeId]));
return ProcessQuery(sql);
}
#endregion
@@ -778,6 +745,40 @@ namespace Umbraco.Core.Persistence.Repositories
#endregion
private IEnumerable<IContent> ProcessQuery(Sql sql)
{
//NOTE: This doesn't allow properties to be part of the query
var dtos = Database.Fetch<DocumentDto, ContentVersionDto, ContentDto, NodeDto>(sql);
//content types
var contentTypes = _contentTypeRepository.GetAll(dtos.Select(x => x.ContentVersionDto.ContentDto.ContentTypeId).ToArray())
.ToArray();
var templates = _templateRepository.GetAll(
dtos
.Where(dto => dto.TemplateId.HasValue && dto.TemplateId.Value > 0)
.Select(x => x.TemplateId.Value).ToArray())
.ToArray();
//Go get the property data for each document
var docDefs = dtos.Select(dto => new Tuple<int, Guid, IContentTypeComposition, DateTime, DateTime>(
dto.NodeId,
dto.VersionId,
contentTypes.First(ct => ct.Id == dto.ContentVersionDto.ContentDto.ContentTypeId),
dto.ContentVersionDto.ContentDto.NodeDto.CreateDate,
dto.ContentVersionDto.VersionDate))
.ToArray();
var propertyData = GetPropertyCollection(docDefs);
return dtos.Select(dto => CreateContentFromDto(
dto,
dto.ContentVersionDto.VersionId,
contentTypes.First(ct => ct.Id == dto.ContentVersionDto.ContentDto.ContentTypeId),
templates.FirstOrDefault(tem => tem.Id == (dto.TemplateId.HasValue ? dto.TemplateId.Value : -1)),
propertyData[dto.NodeId]));
}
/// <summary>
/// Private method to create a content object from a DocumentDto, which is used by Get and GetByVersion.
/// </summary>