using System.Linq.Expressions; using ApplicationHub.Domain.Contracts; using ApplicationHub.Domain.Contracts.Linq; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Query; namespace ApplicationHub.Data.EF.Utils; public class QueryResolver where TEntity : class { public IQueryable Find(IIncludableQueryable dbSet, Expression>? where = null, int? limit = null, int? offset = null, List>, OrderDirection>>? order = null) { IQueryable? expression = null; if (where != null) { var whereConverter = new EntityExpressionConverter(where.Parameters.Single()); expression = dbSet.Where(whereConverter.Convert(where)); } if (offset.HasValue) { expression = expression == null ? dbSet.Skip(offset.Value) : expression.Skip(offset.Value); } if (limit.HasValue) { expression = expression == null ? dbSet.Take(limit.Value) : expression.Take(limit.Value); } if (order != null && order.Any()) { foreach (var orderDescription in order) { var orderConverter = new EntityExpressionConverter(orderDescription.Key.Parameters.Single()); var convertedOrder = orderConverter.Convert(orderDescription.Key); switch (orderDescription.Value) { case OrderDirection.Asc: expression = expression == null ? dbSet.OrderBy(convertedOrder) : expression.OrderBy(convertedOrder); break; case OrderDirection.Desc: expression = expression == null ? dbSet.OrderByDescending(convertedOrder) : expression.OrderByDescending(convertedOrder); break; } } } return expression ?? dbSet.Where(x => true); } public IQueryable Find(DbSet dbSet, Expression>? where = null, int? limit = null, int? offset = null, List>, OrderDirection>>? order = null) { IQueryable? expression = null; if (where != null) { var whereConverter = new EntityExpressionConverter(where.Parameters.Single()); expression = dbSet.Where(whereConverter.Convert(where)); } if (offset.HasValue) { expression = expression == null ? dbSet.Skip(offset.Value) : expression.Skip(offset.Value); } if (limit.HasValue) { expression = expression == null ? dbSet.Take(limit.Value) : expression.Take(limit.Value); } if (order != null && order.Any()) { foreach (var orderDescription in order) { var orderConverter = new EntityExpressionConverter(orderDescription.Key.Parameters.Single()); var convertedOrder = orderConverter.Convert(orderDescription.Key); switch (orderDescription.Value) { case OrderDirection.Asc: expression = expression == null ? dbSet.OrderBy(convertedOrder) : expression.OrderBy(convertedOrder); break; case OrderDirection.Desc: expression = expression == null ? dbSet.OrderByDescending(convertedOrder) : expression.OrderByDescending(convertedOrder); break; } } } return expression ?? dbSet.Where(x => true); } }