106 lines
4.1 KiB
C#
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);
|
|
}
|
|
} |