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);
}
}