#20178: Preventing SELECT N+1 in terms

Work Item: 20178
This commit is contained in:
Sebastien Ros
2013-10-23 15:12:39 -07:00
parent d38d2d15c5
commit b19a89d1d2

View File

@@ -1,6 +1,6 @@
using System;
using System.Collections.Generic;
using System.Collections.Generic;
using System.Linq;
using Orchard.ContentManagement.Utilities;
using Orchard.Taxonomies.Fields;
using Orchard.Taxonomies.Models;
using Orchard.Taxonomies.Services;
@@ -49,16 +49,23 @@ namespace Orchard.Taxonomies.Handlers {
}
private void InitializerTermsLoader(TermsPart part) {
foreach (var field in part.ContentItem.Parts.SelectMany(p => p.Fields).OfType<TaxonomyField>()) {
var tempField = field.Name;
var fieldTermRecordIds = part.Record.Terms.Where(t => t.Field == tempField).Select(tci => tci.TermRecord.Id);
field.TermsField.Loader(value => fieldTermRecordIds.Select(id => _contentManager.Get<TermPart>(id)).ToList());
}
if (part._termParts != null) {
return;
}
part._termParts.Loader(value =>
part.Terms.Select(
x => new TermContentItemPart { Field = x.Field, TermPart = _contentManager.Get<TermPart>(x.TermRecord.Id) }
));
foreach (var field in part.ContentItem.Parts.SelectMany(p => p.Fields).OfType<TaxonomyField>()) {
var tempField = field.Name;
field.TermsField.Loader(value => {
var fieldTermRecordIds = part.Record.Terms.Where(t => t.Field == tempField).Select(tci => tci.TermRecord.Id);
return fieldTermRecordIds.Select(id => _contentManager.Get<TermPart>(id)).ToList();
});
}
part._termParts = new LazyField<IEnumerable<TermContentItemPart>>();
part._termParts.Loader(value =>
part.Terms.Select(
x => new TermContentItemPart { Field = x.Field, TermPart = _contentManager.Get<TermPart>(x.TermRecord.Id) }
));
}
// Retrieve the number of associated content items, for the whole hierarchy