Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 7 additions & 9 deletions src/GraphQL.EntityFramework/Where/ArgumentProcessor_List.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,42 +4,40 @@ public static partial class ArgumentProcessor
{
public static IEnumerable<TItem> ApplyGraphQlArguments<TItem>(this IEnumerable<TItem> items, bool hasId, IResolveFieldContext context)
{
object? GetArguments(Type type, string name) => context.GetArgument(type, name);

if (hasId)
{
if (ArgumentReader.TryReadIds(GetArguments, out var values))
if (ArgumentReader.TryReadIds(context, out var values))
{
var predicate = ExpressionBuilder<TItem>.BuildPredicate("Id", Comparison.In, values);
items = items.Where(predicate.Compile());
}
}

if (ArgumentReader.TryReadWhere(GetArguments, out var wheres))
if (ArgumentReader.TryReadWhere(context, out var wheres))
{
var predicate = ExpressionBuilder<TItem>.BuildPredicate(wheres);
items = items.Where(predicate.Compile());
}

items = Order(items, GetArguments);
items = Order(items, context);

if (ArgumentReader.TryReadSkip(GetArguments, out var skip))
if (ArgumentReader.TryReadSkip(context, out var skip))
{
items = items.Skip(skip);
}

if (ArgumentReader.TryReadTake(GetArguments, out var take))
if (ArgumentReader.TryReadTake(context, out var take))
{
items = items.Take(take);
}

return items;
}

static IEnumerable<TItem> Order<TItem>(IEnumerable<TItem> queryable, Func<Type, string, object?> getArguments)
static IEnumerable<TItem> Order<TItem>(IEnumerable<TItem> queryable, IResolveFieldContext context)
{
var items = queryable.ToList();
var orderBys = ArgumentReader.ReadOrderBy(getArguments).ToList();
var orderBys = ArgumentReader.ReadOrderBy(context).ToList();
IOrderedEnumerable<TItem> ordered;
if (orderBys.Count > 0)
{
Expand Down
16 changes: 7 additions & 9 deletions src/GraphQL.EntityFramework/Where/ArgumentProcessor_Queryable.cs
Original file line number Diff line number Diff line change
Expand Up @@ -9,34 +9,32 @@ public static IQueryable<TItem> ApplyGraphQlArguments<TItem>(
bool applyOrder)
where TItem : class
{
object? GetArguments(Type type, string name) => context.GetArgument(type, name);

if (keyNames is not null)
{
if (ArgumentReader.TryReadIds(GetArguments, out var values))
if (ArgumentReader.TryReadIds(context, out var values))
{
var keyName = GetKeyName(keyNames);
var predicate = ExpressionBuilder<TItem>.BuildPredicate(keyName, Comparison.In, values);
queryable = queryable.Where(predicate);
}
}

if (ArgumentReader.TryReadWhere(GetArguments, out var wheres))
if (ArgumentReader.TryReadWhere(context, out var wheres))
{
var predicate = ExpressionBuilder<TItem>.BuildPredicate(wheres);
queryable = queryable.Where(predicate);
}

if (applyOrder)
{
queryable = Order(queryable, GetArguments);
queryable = Order(queryable, context);

if (ArgumentReader.TryReadSkip(GetArguments, out var skip))
if (ArgumentReader.TryReadSkip(context, out var skip))
{
queryable = queryable.Skip(skip);
}

if (ArgumentReader.TryReadTake(GetArguments, out var take))
if (ArgumentReader.TryReadTake(context, out var take))
{
queryable = queryable.Take(take);
}
Expand All @@ -55,9 +53,9 @@ static string GetKeyName(List<string> keyNames)
return keyNames[0];
}

static IQueryable<TItem> Order<TItem>(IQueryable<TItem> queryable, Func<Type, string, object?> getArguments)
static IQueryable<TItem> Order<TItem>(IQueryable<TItem> queryable, IResolveFieldContext context)
{
var orderBys = ArgumentReader.ReadOrderBy(getArguments).ToList();
var orderBys = ArgumentReader.ReadOrderBy(context).ToList();
IOrderedQueryable<TItem> ordered;
if (orderBys.Count > 0)
{
Expand Down
29 changes: 15 additions & 14 deletions src/GraphQL.EntityFramework/Where/ArgumentReader.cs
Original file line number Diff line number Diff line change
@@ -1,15 +1,16 @@
static class ArgumentReader
{
public static bool TryReadWhere(Func<Type, string, object?> getArgument, out IEnumerable<WhereExpression> expression)
public static bool TryReadWhere(IResolveFieldContext context, out IEnumerable<WhereExpression> expression)
{
expression = getArgument.ReadList<WhereExpression>("where");
expression = ReadList<WhereExpression>(context, "where");

return expression.Any();
}

public static IEnumerable<OrderBy> ReadOrderBy(Func<Type, string, object?> getArgument) => getArgument.ReadList<OrderBy>("orderBy");
public static IEnumerable<OrderBy> ReadOrderBy(IResolveFieldContext context) =>
ReadList<OrderBy>(context, "orderBy");

public static bool TryReadIds(Func<Type, string, object?> getArgument, [NotNullWhen(true)] out string[]? result)
public static bool TryReadIds(IResolveFieldContext context, [NotNullWhen(true)] out string[]? result)
{
string ArgumentToExpression(object argument)
{
Expand All @@ -22,8 +23,8 @@ string ArgumentToExpression(object argument)
};
}

var idsArgument = getArgument(typeof(object), "ids");
var idArgument = getArgument(typeof(object), "id");
var idsArgument = context.GetArgument(typeof(object), "ids");
var idArgument = context.GetArgument(typeof(object), "id");
if (idsArgument is null && idArgument is null)
{
result = null;
Expand Down Expand Up @@ -51,9 +52,9 @@ string ArgumentToExpression(object argument)
return true;
}

public static bool TryReadSkip(Func<Type, string, object?> getArgument, out int skip)
public static bool TryReadSkip(IResolveFieldContext context, out int skip)
{
var result = getArgument.TryReadInt("skip", out skip);
var result = TryReadInt("skip", context, out skip);
if (result)
{
if (skip < 0)
Expand All @@ -64,9 +65,9 @@ public static bool TryReadSkip(Func<Type, string, object?> getArgument, out int
return result;
}

public static bool TryReadTake(Func<Type, string, object?> getArgument, out int take)
public static bool TryReadTake(IResolveFieldContext context, out int take)
{
var result = getArgument.TryReadInt("take", out take);
var result = TryReadInt("take", context, out take);
if (result)
{
if (take < 0)
Expand All @@ -77,9 +78,9 @@ public static bool TryReadTake(Func<Type, string, object?> getArgument, out int
return result;
}

static IEnumerable<T> ReadList<T>(this Func<Type, string, object?> getArgument, string name)
static IEnumerable<T> ReadList<T>(IResolveFieldContext context, string name)
{
var argument = getArgument(typeof(T[]), name);
var argument = context.GetArgument(typeof(T[]), name);
if (argument is null)
{
return Enumerable.Empty<T>();
Expand All @@ -88,9 +89,9 @@ static IEnumerable<T> ReadList<T>(this Func<Type, string, object?> getArgument,
return (T[]) argument;
}

static bool TryReadInt(this Func<Type, string, object?> getArgument, string name, out int value)
static bool TryReadInt(string name, IResolveFieldContext context, out int value)
{
var argument = getArgument(typeof(int), name);
var argument = context.GetArgument(typeof(int), name);
if (argument is null)
{
value = 0;
Expand Down