106 lines
4.1 KiB
C#

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<TModel, TEntity> where TEntity : class
{
public IQueryable<TEntity> Find(IIncludableQueryable<TEntity, object?> dbSet, Expression<Func<TModel, bool>>? where = null, int? limit = null, int? offset = null, List<KeyValuePair<Expression<Func<TModel, bool>>, OrderDirection>>? order = null)
{
IQueryable<TEntity>? expression = null;
if (where != null)
{
var whereConverter = new EntityExpressionConverter<TModel, TEntity>(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<TModel, TEntity>(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<TEntity> Find(DbSet<TEntity> dbSet, Expression<Func<TModel, bool>>? where = null, int? limit = null, int? offset = null, List<KeyValuePair<Expression<Func<TModel, bool>>, OrderDirection>>? order = null)
{
IQueryable<TEntity>? expression = null;
if (where != null)
{
var whereConverter = new EntityExpressionConverter<TModel, TEntity>(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<TModel, TEntity>(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);
}
}