From 60464035f71617f105dcf88dc65251cc29d0919f Mon Sep 17 00:00:00 2001 From: Matteo Piovanelli Date: Thu, 7 May 2020 19:29:58 +0200 Subject: [PATCH] Save MemberBindingRecords in memory (#8371) Prevent fetching the same table from the database 5+ times per request by loading it and saving it in a private property for a request. --- .../Services/CustomMemberBindingProvider.cs | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/src/Orchard.Web/Modules/Orchard.Projections/Services/CustomMemberBindingProvider.cs b/src/Orchard.Web/Modules/Orchard.Projections/Services/CustomMemberBindingProvider.cs index 5b28d941e..20c35d24b 100644 --- a/src/Orchard.Web/Modules/Orchard.Projections/Services/CustomMemberBindingProvider.cs +++ b/src/Orchard.Web/Modules/Orchard.Projections/Services/CustomMemberBindingProvider.cs @@ -1,4 +1,5 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Reflection; using Orchard.Data; @@ -16,11 +17,18 @@ namespace Orchard.Projections.Services { _sessionFactoryHolder = sessionFactoryHolder; } + private List memberBindings; public void GetMemberBindings(BindingBuilder builder) { var recordBluePrints = _sessionFactoryHolder.GetSessionFactoryParameters().RecordDescriptors; - foreach(var member in _repository.Table.ToList()) { + // save this in memory once per request, to avoid hitting the database 5+ + // times per projection per request. + if (memberBindings == null) { + memberBindings = _repository.Table.ToList(); + } + + foreach (var member in memberBindings) { var record = recordBluePrints.FirstOrDefault(r => String.Equals(r.Type.FullName, member.Type, StringComparison.OrdinalIgnoreCase)); if (record == null) { @@ -28,7 +36,7 @@ namespace Orchard.Projections.Services { } var property = record.Type.GetProperty(member.Member, BindingFlags.Instance | BindingFlags.Public); - if(property == null) { + if (property == null) { continue; }