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; }