Inheritance: BuildExpressionContext
Example #1
0
        public void GenerateCondition(FilterBuildExpressionContext filterContext)
        {
            List<CollectionElementToken> allAny = Token.Follow(a => a.Parent)
                .OfType<CollectionElementToken>()
                .Where(a => !a.CollectionElementType.IsElement())
                .Reverse()
                .ToList();

            List<IFilterExpression> filters = filterContext.Filters;
            foreach (var ct in allAny)
            {
                var allAnyFilter = filterContext.AllAnyFilters.GetOrCreate(ct, () =>
                {
                    var newAllAnyFilter = new AnyAllFilter(ct);

                    filterContext.Replacemens.Add(ct, ct.CreateExpression(newAllAnyFilter.Parameter));

                    filters.Add(newAllAnyFilter);

                    return newAllAnyFilter;
                });

                filters = allAnyFilter.Filters;
            }

            var exp = GetConditionBasic(filterContext);

            filters.Add(new FilterExpression(exp));
        }
        public Expression ToExpression(FilterBuildExpressionContext ctx)
        {
            var collection = Token.Parent.BuildExpression(ctx);

            var and = Filters.Select(f => f.ToExpression(ctx)).AggregateAnd();

            string type = Token.CollectionElementType.ToString();

            if (type.StartsWith("AnyNo"))
                and = Expression.Not(and);

            var lambda = Expression.Lambda(and, Parameter);

            MethodInfo mi = typeof(IQueryable).IsAssignableFrom(Token.Parent.Type) ?
                 (type.StartsWith("All") ? miAllQ : miAnyQ) :
                 (type.StartsWith("All") ? miAllE : miAnyE);

            var result = Expression.Call(mi.MakeGenericMethod(Parameter.Type), collection, lambda);

            if (type.StartsWith("NoOne"))
                return Expression.Not(result);

            return result;
        }
 public Expression ToExpression(FilterBuildExpressionContext ctx)
 {
     return Expression;
 }