From 4e083ad2d44496c06ef847347c0385236443be34 Mon Sep 17 00:00:00 2001 From: enisn Date: Mon, 21 Dec 2020 10:00:52 +0300 Subject: [PATCH] Refactor of Bulk Operations Implementat'on --- .../Domain/Repositories/IBasicRepository.cs | 2 +- .../EntityFrameworkCore/EfCoreRepository.cs | 12 +++--------- .../MemoryDb/MemoryDbRepository.cs | 11 ++--------- .../MongoDB/IMongoDbBulkOperationProvider.cs | 2 -- .../MongoDB/IMongoDbRepositoryFilterer.cs | 4 ++-- .../Repositories/MongoDB/MongoDbRepository.cs | 18 ++++++++---------- 6 files changed, 16 insertions(+), 33 deletions(-) diff --git a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IBasicRepository.cs b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IBasicRepository.cs index 06a222cda7..331001fcb1 100644 --- a/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IBasicRepository.cs +++ b/framework/src/Volo.Abp.Ddd.Domain/Volo/Abp/Domain/Repositories/IBasicRepository.cs @@ -54,8 +54,8 @@ namespace Volo.Abp.Domain.Repositories /// This is useful for ORMs / database APIs those only save changes with an explicit method call, but you need to immediately save changes to the database. /// A to observe while waiting for the task to complete. /// Awaitable . - Task UpdateManyAsync([NotNull] IEnumerable entities, bool autoSave = false, CancellationToken cancellationToken = default); + /// /// Deletes an entity. /// diff --git a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs index 437e32ad40..ca885bd4fb 100644 --- a/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs +++ b/framework/src/Volo.Abp.EntityFrameworkCore/Volo/Abp/Domain/Repositories/EntityFrameworkCore/EfCoreRepository.cs @@ -344,17 +344,11 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore await DeleteAsync(entity, autoSave, cancellationToken); } - public async Task DeleteManyAsync([NotNull] IEnumerable ids, bool autoSave = false, CancellationToken cancellationToken = default) + public async virtual Task DeleteManyAsync([NotNull] IEnumerable ids, bool autoSave = false, CancellationToken cancellationToken = default) { - foreach (var id in ids) - { - await DeleteAsync(id, cancellationToken: cancellationToken); - } + var entities = await DbSet.Where(x => ids.Contains(x.Id)).ToListAsync(); - if (autoSave) - { - await SaveChangesAsync(cancellationToken); - } + await DeleteManyAsync(entities, autoSave, cancellationToken); } } } diff --git a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs index 63203d8b0f..7c67e254ee 100644 --- a/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs +++ b/framework/src/Volo.Abp.MemoryDb/Volo/Abp/Domain/Repositories/MemoryDb/MemoryDbRepository.cs @@ -313,15 +313,8 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb public virtual async Task DeleteManyAsync([NotNull] IEnumerable ids, bool autoSave = false, CancellationToken cancellationToken = default) { - foreach (var id in ids) - { - await DeleteAsync(id, cancellationToken: cancellationToken); - } - - if (autoSave) - { - await SaveChangesAsync(cancellationToken); - } + var entities = await AsyncExecuter.ToListAsync(GetQueryable().Where(x => ids.Contains(x.Id))); + DeleteManyAsync(entities, autoSave, cancellationToken); } } } diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbBulkOperationProvider.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbBulkOperationProvider.cs index 367a70bb86..1436a7bab7 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbBulkOperationProvider.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbBulkOperationProvider.cs @@ -16,7 +16,6 @@ namespace Volo.Abp.MongoDB.Volo.Abp.Domain.Repositories.MongoDB ) where TEntity : class, IEntity; - Task UpdateManyAsync( IMongoDbRepository repository, IEnumerable entities, @@ -25,7 +24,6 @@ namespace Volo.Abp.MongoDB.Volo.Abp.Domain.Repositories.MongoDB ) where TEntity : class, IEntity; - Task DeleteManyAsync( IMongoDbRepository repository, IEnumerable entities, diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs index 5a96a29022..dfabd8dde3 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/IMongoDbRepositoryFilterer.cs @@ -16,7 +16,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB FilterDefinition CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null); /// - /// Creates 'In' filter for mongoDb. + /// Creates filter for given entities. /// /// /// Visit https://docs.mongodb.com/manual/reference/operator/query/in/ to get more information about 'in' operator. @@ -27,7 +27,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB FilterDefinition CreateEntitiesFilter(IEnumerable entities, bool applyFilters = false); /// - /// Creates 'In' filter for mongoDb. + /// Creates filter for given ids. /// /// /// Visit https://docs.mongodb.com/manual/reference/operator/query/in/ to get more information about 'in' operator. diff --git a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs index 7c910d350f..f24c553509 100644 --- a/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs +++ b/framework/src/Volo.Abp.MongoDB/Volo/Abp/Domain/Repositories/MongoDB/MongoDbRepository.cs @@ -195,27 +195,25 @@ namespace Volo.Abp.Domain.Repositories.MongoDB var entitiesCount = entities.Count(); BulkWriteResult result; + List> replaceRequests = new List>(); + foreach (var entity in entities) + { + replaceRequests.Add(new ReplaceOneModel(CreateEntityFilter(entity), entity)); + } + if (SessionHandle != null) { - result = await Collection.BulkWriteAsync(SessionHandle, GetReplaceRequests()); + result = await Collection.BulkWriteAsync(SessionHandle, replaceRequests); } else { - result = await Collection.BulkWriteAsync(GetReplaceRequests()); + result = await Collection.BulkWriteAsync(replaceRequests); } if (result.MatchedCount < entitiesCount) { ThrowOptimisticConcurrencyException(); } - - IEnumerable> GetReplaceRequests() - { - foreach (var entity in entities) - { - yield return new ReplaceOneModel(CreateEntityFilter(entity), entity); - } - } } public async override Task DeleteAsync(