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);
        }
示例#4
0
 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());