From 88a20cb13cbde845829cbe00efa581f9737713e4 Mon Sep 17 00:00:00 2001 From: Ronald Barendse Date: Wed, 13 Oct 2021 13:46:51 +0200 Subject: [PATCH] Minor query cleanup --- .../Repositories/Implement/DictionaryRepository.cs | 4 ++-- .../Repositories/Implement/MemberRepository.cs | 11 ++++------- .../Implement/RepositoryBaseOfTIdTEntity.cs | 6 ++++-- 3 files changed, 10 insertions(+), 11 deletions(-) diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs index 7895b7aa8f..da957a7288 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/DictionaryRepository.cs @@ -261,11 +261,11 @@ namespace Umbraco.Core.Persistence.Repositories.Implement Func>> getItemsFromParents = guids => { return guids.InGroupsOf(Constants.Sql.MaxParameterCount) - .Select(@group => + .Select(group => { var sqlClause = GetBaseQuery(false) .Where(x => x.Parent != null) - .Where($"{SqlSyntax.GetQuotedColumnName("parent")} IN (@parentIds)", new { parentIds = @group }); + .WhereIn(x => x.Parent, group); var translator = new SqlTranslator(sqlClause, Query()); var sql = translator.Translate(); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs index 62f41aa727..1982d6ebf9 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/MemberRepository.cs @@ -431,16 +431,13 @@ namespace Umbraco.Core.Persistence.Repositories.Implement var matchedMembers = Get(query).ToArray(); var membersInGroup = new List(); - //then we need to filter the matched members that are in the role - //since the max sql params are 2100 on sql server, we'll reduce that to be safe for potentially other servers and run the queries in batches - var inGroups = matchedMembers.InGroupsOf(1000); - foreach (var batch in inGroups) - { - var memberIdBatch = batch.Select(x => x.Id); + //then we need to filter the matched members that are in the role + foreach (var group in matchedMembers.Select(x => x.Id).InGroupsOf(Constants.Sql.MaxParameterCount)) + { var sql = Sql().SelectAll().From() .Where(dto => dto.MemberGroup == memberGroup.Id) - .WhereIn(dto => dto.Member, memberIdBatch); + .WhereIn(dto => dto.Member, group); var memberIdsInGroup = Database.Fetch(sql) .Select(x => x.Member).ToArray(); diff --git a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs b/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs index c2aec05fa7..5892f2bf49 100644 --- a/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs +++ b/src/Umbraco.Core/Persistence/Repositories/Implement/RepositoryBaseOfTIdTEntity.cs @@ -188,14 +188,16 @@ namespace Umbraco.Core.Persistence.Repositories.Implement // the additional overhead of fetching them in groups is minimal compared to the lookup time of each group if (ids.Length <= Constants.Sql.MaxParameterCount) { + // the additional overhead of fetching them in groups is minimal compared to the lookup time of each group return CachePolicy.GetAll(ids, PerformGetAll); } var entities = new List(); - foreach (var groupOfIds in ids.InGroupsOf(Constants.Sql.MaxParameterCount)) + foreach (var group in ids.InGroupsOf(Constants.Sql.MaxParameterCount)) { - entities.AddRange(CachePolicy.GetAll(groupOfIds.ToArray(), PerformGetAll)); + entities.AddRange(CachePolicy.GetAll(group.ToArray(), PerformGetAll)); } + return entities; }