public static QueryableClosure AddIsNullClosure( this IQueryableFilterVisitorContext context, Type type) { QueryableClosure closure = context.AddClosure(type, "_s" + context.Closures.Count, false); context.GetLevel().Enqueue(FilterExpressionBuilder.Equals(closure.Parameter, null)); return(closure); }
public static QueryableClosure AddClosure( this IQueryableFilterVisitorContext context, Type type, string parameterName, bool inMemory) { var closure = new QueryableClosure(type, parameterName, inMemory); context.Closures.Push(closure); return(closure); }
public static bool TryCreateLambda( this QueryableClosure closure, [NotNullWhen(true)] out LambdaExpression?expression) { expression = null; if (closure.Level.Peek().Count == 0) { return(false); } expression = closure.InMemory ? Expression.Lambda(closure.GetExpressionBodyWithNullCheck(), closure.Parameter) : Expression.Lambda(closure.Level.Peek().Peek(), closure.Parameter); return(true); }
public QueryableFilterVisitorContext( IReadOnlyList <IExpressionOperationHandler> operationHandlers, IReadOnlyList <IExpressionFieldHandler> fieldHandlers, ITypeConversion typeConverter, QueryableClosure closures, bool inMemory) { if (closures is null) { throw new ArgumentNullException(nameof(closures)); } OperationHandlers = operationHandlers ?? throw new ArgumentNullException(nameof(operationHandlers)); FieldHandlers = fieldHandlers ?? throw new ArgumentNullException(nameof(fieldHandlers)); TypeConverter = typeConverter ?? throw new ArgumentNullException(nameof(typeConverter)); InMemory = inMemory; Closures = new Stack <QueryableClosure>(); Closures.Push(closures); }
private static Expression GetExpressionBodyWithNullCheck(this QueryableClosure closure) => FilterExpressionBuilder.NotNullAndAlso(closure.Parameter, closure.Level.Peek().Peek());