#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.Caching;
using Orchard.ContentManagement; using Orchard.ContentManagement;
using Orchard.ContentManagement.MetaData;
using Orchard.DisplayManagement.Implementation; using Orchard.DisplayManagement.Implementation;
using Orchard.Templates.Models; using Orchard.Templates.Models;
using System; using System;
@@ -15,17 +16,20 @@ namespace Orchard.Templates.Services {
private ICacheManager _cacheManager; private ICacheManager _cacheManager;
private ISignals _signals; private ISignals _signals;
private IContentManager _contentManager; private IContentManager _contentManager;
private IContentDefinitionManager _contentDefinitionManager;
private ITemplateService _templateService; private ITemplateService _templateService;
public TemplateShapeBindingResolver( public TemplateShapeBindingResolver(
ICacheManager cacheManager, ICacheManager cacheManager,
ISignals signals, ISignals signals,
IContentManager contentManager, IContentManager contentManager,
IContentDefinitionManager contentDefinitionManager,
ITemplateService templateService ITemplateService templateService
) { ) {
_cacheManager = cacheManager; _cacheManager = cacheManager;
_signals = signals; _signals = signals;
_contentManager = contentManager; _contentManager = contentManager;
_contentDefinitionManager = contentDefinitionManager;
_templateService = templateService; _templateService = templateService;
} }
@@ -54,7 +58,14 @@ namespace Orchard.Templates.Services {
return _cacheManager.Get("Template.ShapeProcessors", ctx => { return _cacheManager.Get("Template.ShapeProcessors", ctx => {
ctx.Monitor(_signals.When(DefaultTemplateService.TemplatesSignal)); 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 { return allTemplates.Select(x => new TemplateResult {
Name = x.Name, Name = x.Name,

View File

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

View File

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