using System.Linq.Expressions; using Elsa.Common.Models; using JetBrains.Annotations; using Microsoft.EntityFrameworkCore; // ReSharper disable once CheckNamespace namespace Elsa.Persistence.EFCore.Extensions; /// /// Provides extensions to . /// [PublicAPI] public static class QueryableExtensions { /// /// Inserts a list of entities in bulk. /// public static async Task BulkInsertAsync(this TDbContext dbContext, IList entities, CancellationToken cancellationToken = default) where TDbContext : DbContext where TEntity : class, new() { var set = dbContext.Set(); if (entities.Any()) await set.AddRangeAsync(entities, cancellationToken); await dbContext.SaveChangesAsync(cancellationToken); } /// /// Returns a paged result from the specified query. /// public static async Task> PaginateAsync(this IQueryable queryable, Expression> projection, PageArgs? pageArgs = null) { var count = await queryable.CountAsync(); if (pageArgs?.Offset != null) queryable = queryable.Skip(pageArgs.Offset.Value); if (pageArgs?.Limit != null) queryable = queryable.Take(pageArgs.Limit.Value); var results = await queryable.Select(projection).ToListAsync(); return Page.Of(results, count); } /// /// Returns a paged result from the specified query. /// public static async Task> PaginateAsync(this IQueryable queryable, PageArgs? pageArgs = null) { var count = await queryable.CountAsync(); if (pageArgs?.Offset != null) queryable = queryable.Skip(pageArgs.Offset.Value); if (pageArgs?.Limit != null) queryable = queryable.Take(pageArgs.Limit.Value); var results = await queryable.ToListAsync(); return Page.Of(results, count); } }