#20909: Fix Content Manager Query Performance without Record

Work Item: 20909
This commit is contained in:
Daniel Dabrowski
2015-02-01 15:15:16 +01:00
committed by agriffard
parent ccec5fd330
commit 12285abca8
3 changed files with 14 additions and 2 deletions

View File

@@ -1,5 +1,6 @@
using Orchard.Caching;
using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData;
using Orchard.DisplayManagement.Implementation;
using Orchard.Templates.Models;
using System;
@@ -15,17 +16,20 @@ namespace Orchard.Templates.Services {
private ICacheManager _cacheManager;
private ISignals _signals;
private IContentManager _contentManager;
private IContentDefinitionManager _contentDefinitionManager;
private ITemplateService _templateService;
public TemplateShapeBindingResolver(
ICacheManager cacheManager,
ISignals signals,
IContentManager contentManager,
IContentDefinitionManager contentDefinitionManager,
ITemplateService templateService
) {
_cacheManager = cacheManager;
_signals = signals;
_contentManager = contentManager;
_contentDefinitionManager = contentDefinitionManager;
_templateService = templateService;
}
@@ -54,7 +58,14 @@ namespace Orchard.Templates.Services {
return _cacheManager.Get("Template.ShapeProcessors", ctx => {
ctx.Monitor(_signals.When(DefaultTemplateService.TemplatesSignal));
var allTemplates = _contentManager.Query<ShapePart>().List();
// select all name of types which contains ShapePart
var typesWithShapePart = _contentDefinitionManager
.ListTypeDefinitions()
.Where(ct => ct.Parts.Any(cp => cp.PartDefinition.Name == "ShapePart"))
.Select(ct => ct.Name)
.ToArray();
var allTemplates = _contentManager.Query<ShapePart>(typesWithShapePart).List();
return allTemplates.Select(x => new TemplateResult {
Name = x.Name,

View File

@@ -53,6 +53,7 @@ namespace Orchard.Widgets.Filters {
// Once the Rule Engine is done:
// Get Layers and filter by zone and rule
// NOTE: .ForType("Layer") is faster than .Query<LayerPart, LayerPartRecord>()
IEnumerable<LayerPart> activeLayers = _orchardServices.ContentManager.Query<LayerPart>().ForType("Layer").List();
var activeLayerIds = new List<int>();

View File

@@ -72,7 +72,7 @@ namespace Orchard.Widgets.Services {
public IEnumerable<WidgetPart> GetWidgets(int[] layerIds) {
return _contentManager
.Query<WidgetPart>()
.Query<WidgetPart, WidgetPartRecord>()
.WithQueryHints(new QueryHints().ExpandParts<CommonPart>())
.Where<CommonPartRecord>(x => layerIds.Contains(x.Container.Id))
.List();