Reverted bulk implementation (#5047)

This commit is contained in:
raymonddenhaan 2024-03-08 14:25:40 +01:00 committed by GitHub
parent 13304cdb64
commit 6084e29d47
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -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>