public void Should_exclude_bound_parameters() { Expression <Func <int, int, int> > expr = (x, y) => x + y; var parameters = Scanners.FindUnboundParameters(expr); Assert.Empty(parameters); }
public void Should_include_unbound_parameters() { var param1 = Expression.Parameter(typeof(int)); var expr = Expression.Lambda( Expression.Add( left: Expression.Parameter(typeof(int), "unbound"), right: param1), param1); var parameters = Scanners.FindUnboundParameters(expr); Assert.Single(parameters, p => p.Name == "unbound"); }
internal static ValueTask <Validation <string, Func <CancellationToken, TResult> > > CompileQuery <TSourceDescription, TResult>( Expression expression, Verifier verify, Authorizer <TSourceDescription> authorize, IReadOnlyDictionary <string, TSourceDescription> bindings, Func <Expression, Expression> boxingRewriter) where TSourceDescription : IQueryableSourceDescription => from verified in verify(expression).ToValueTask() let unboundParameters = Scanners.FindUnboundParameters(expression) from methodBindings in BindMethods(unboundParameters, bindings).ToValueTask() from authorized in authorize(methodBindings.Values) let lambdaBindings = BindLambdas(methodBindings) let syntheticParameters = new[] { Expression.Parameter(typeof(CancellationToken)) } from invocationBindings in BindInvocations(lambdaBindings, syntheticParameters).ToValueTask() let boundQuery = BindingRewriter.Rewrite(expression, invocationBindings) let boxedQuery = boxingRewriter(boundQuery) select Expression.Lambda <Func <CancellationToken, TResult> >(boxedQuery, syntheticParameters).Compile();