Reverted bulk implementation (#5047)
This commit is contained in:
parent
13304cdb64
commit
6084e29d47
|
|
@ -1,5 +1,4 @@
|
|||
using System.Linq.Expressions;
|
||||
using EFCore.BulkExtensions;
|
||||
using Elsa.Common.Models;
|
||||
using JetBrains.Annotations;
|
||||
using Microsoft.EntityFrameworkCore;
|
||||
|
|
@ -18,10 +17,24 @@ public static class QueryableExtensions
|
|||
/// </summary>
|
||||
public static async Task BulkUpsertAsync<TDbContext, TEntity>(this TDbContext dbContext, IList<TEntity> entities, Expression<Func<TEntity, string>> keySelector, CancellationToken cancellationToken = default) where TDbContext : DbContext where TEntity : class
|
||||
{
|
||||
await dbContext.BulkInsertOrUpdateAsync(entities, new BulkConfig
|
||||
{
|
||||
EnableShadowProperties = true
|
||||
}, cancellationToken: cancellationToken);
|
||||
var set = dbContext.Set<TEntity>();
|
||||
var compiledKeySelector = keySelector.Compile();
|
||||
var containsLambda = entities.Any() ? keySelector.BuildContainsExpression(entities) : default;
|
||||
var existingEntitiesQuery = set.AsNoTracking();
|
||||
|
||||
if (containsLambda != null)
|
||||
existingEntitiesQuery = existingEntitiesQuery.Where(containsLambda);
|
||||
|
||||
var existingEntities = await existingEntitiesQuery.ToListAsync(cancellationToken);
|
||||
var entitiesToUpdate = entities.IntersectBy(existingEntities.Select(compiledKeySelector), compiledKeySelector).ToList();
|
||||
var entitiesToInsert = entities.Except(entitiesToUpdate).ToList();
|
||||
|
||||
if (entitiesToUpdate.Any())
|
||||
set.UpdateRange(entitiesToUpdate);
|
||||
if (entitiesToInsert.Any())
|
||||
await set.AddRangeAsync(entitiesToInsert, cancellationToken);
|
||||
|
||||
await dbContext.SaveChangesAsync(cancellationToken);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
|
|
|||
Loading…
Reference in a new issue