Refactor of Bulk Operations Implementating

pull/6676/head
enisn 5 years ago
parent a96de62437
commit f37229857c

@ -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.</param>
/// <param name="cancellationToken">A <see cref="T:System.Threading.CancellationToken" /> to observe while waiting for the task to complete.</param>
/// <returns>Awaitable <see cref="Task"/>.</returns>
Task UpdateManyAsync([NotNull] IEnumerable<TEntity> entities, bool autoSave = false, CancellationToken cancellationToken = default);
/// <summary>
/// Deletes an entity.
/// </summary>

@ -344,17 +344,11 @@ namespace Volo.Abp.Domain.Repositories.EntityFrameworkCore
await DeleteAsync(entity, autoSave, cancellationToken);
}
public async Task DeleteManyAsync([NotNull] IEnumerable<TKey> ids, bool autoSave = false, CancellationToken cancellationToken = default)
public async virtual Task DeleteManyAsync([NotNull] IEnumerable<TKey> 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);
}
}
}

@ -313,15 +313,8 @@ namespace Volo.Abp.Domain.Repositories.MemoryDb
public virtual async Task DeleteManyAsync([NotNull] IEnumerable<TKey> 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);
}
}
}

@ -16,7 +16,6 @@ namespace Volo.Abp.MongoDB.Volo.Abp.Domain.Repositories.MongoDB
)
where TEntity : class, IEntity;
Task UpdateManyAsync<TEntity>(
IMongoDbRepository<TEntity> repository,
IEnumerable<TEntity> entities,
@ -25,7 +24,6 @@ namespace Volo.Abp.MongoDB.Volo.Abp.Domain.Repositories.MongoDB
)
where TEntity : class, IEntity;
Task DeleteManyAsync<TEntity>(
IMongoDbRepository<TEntity> repository,
IEnumerable<TEntity> entities,

@ -16,7 +16,7 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
FilterDefinition<TEntity> CreateEntityFilter(TEntity entity, bool withConcurrencyStamp = false, string concurrencyStamp = null);
/// <summary>
/// Creates 'In' filter for mongoDb.
/// Creates filter for given entities.
/// </summary>
/// <remarks>
/// 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<TEntity> CreateEntitiesFilter(IEnumerable<TEntity> entities, bool applyFilters = false);
/// <summary>
/// Creates 'In' filter for mongoDb.
/// Creates filter for given ids.
/// </summary>
/// <remarks>
/// Visit https://docs.mongodb.com/manual/reference/operator/query/in/ to get more information about 'in' operator.

@ -195,27 +195,25 @@ namespace Volo.Abp.Domain.Repositories.MongoDB
var entitiesCount = entities.Count();
BulkWriteResult result;
List<WriteModel<TEntity>> replaceRequests = new List<WriteModel<TEntity>>();
foreach (var entity in entities)
{
replaceRequests.Add(new ReplaceOneModel<TEntity>(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<WriteModel<TEntity>> GetReplaceRequests()
{
foreach (var entity in entities)
{
yield return new ReplaceOneModel<TEntity>(CreateEntityFilter(entity), entity);
}
}
}
public async override Task DeleteAsync(

Loading…
Cancel
Save