29 QueryContext<TResult>? queryContext)
32 ArgumentNullException.ThrowIfNull(queryable);
34 if (queryContext ==
null)
38 if (queryContext.Predicate !=
null)
40 queryable = queryable.Where(
41 TranslateLambda<TQueried, TResult, bool>(
42 queryContext.Predicate));
46 if (queryContext.Sorting?.Operations.Length > 0)
48 var definition =
new SortDefinition<ProjectedPair<TQueried, TResult>>(
49 queryContext.Sorting.Operations
52 queryable = queryable.OrderBy(definition);
56 if (queryContext.Selector !=
null)
61 Queried = initialProjected.
Queried,
62 Result = selectedResult,
64 Expression<Func<ProjectedPair<TQueried, TResult>, TResult>> resultSelector = projected => projected.Result;
66 var result = Expression.Parameter(typeof(TResult),
"resultParam");
67 var initialResultExpr = Expression.Invoke(resultSelector, parameter);
68 var resultExpr = Expression.Invoke(queryContext.Selector, initialResultExpr);
69 var finalInvoke = Expression.Invoke(remapSelector, parameter, resultExpr);
72 queryable = queryable.Select(finalExpr);
78 .TagWith(
"GraphQL Projections");
92 var sortingKeyType = sortBy.GetType().GenericTypeArguments[1];
101 .GetMethod(nameof(TranslateLambda), BindingFlags.NonPublic | BindingFlags.Static)!
102 .MakeGenericMethod(typeof(TQueried), typeof(TResult), sortingKeyType);
104 var fixedLambda = instantiatedLambdaTranslate.Invoke(
null, [sortBy.KeySelector])!;
106 var instantiatedFactoryMethod = factoryMethod.MakeGenericMethod(sortingKeyType);
121 Expression<Func<ProjectedPair<TQueried, TResult>, TResult>> resultSelector = projected => projected.
Result;
124 var result = Expression.Invoke(resultSelector, parameter);
125 var expr = Expression.Invoke(selectionExpression, result);
127 return Expression.Lambda<Func<ProjectedPair<TQueried, TResult>, TDesired>>(expr, parameter);