/// <summary> /// 指定 FilterKeyValueAction 集合获取 Lambda 表达式 /// </summary> /// <typeparam name="TItem"></typeparam> /// <param name="filters"></param> /// <returns></returns> public static Expression <Func <TItem, bool> > GetFilterLambda <TItem>(this IEnumerable <FilterKeyValueAction> filters) { Expression <Func <TItem, bool> >?ret = null; var exp_p = Expression.Parameter(typeof(TItem)); var visitor = new ComboExpressionVisitor(exp_p); foreach (var filter in filters) { var exp = filter.GetFilterLambda <TItem>(); if (ret == null) { ret = exp; continue; } var left = visitor.Visit(ret.Body); var right = visitor.Visit(exp.Body); ret = filter.FilterLogic switch { FilterLogic.And => Expression.Lambda <Func <TItem, bool> >(Expression.AndAlso(left, right), exp_p), _ => Expression.Lambda <Func <TItem, bool> >(Expression.OrElse(left, right), exp_p), }; } return(ret ?? (r => true)); }
/// <summary> /// 表达式取 and 逻辑操作方法 /// </summary> /// <typeparam name="TItem"></typeparam> /// <param name="expressions"></param> /// <param name="logic"></param> /// <returns></returns> private static Expression <Func <TItem, bool> > ExpressionAndLambda <TItem>(this IEnumerable <Expression <Func <TItem, bool> > > expressions, FilterLogic logic = FilterLogic.And) { Expression <Func <TItem, bool> >?ret = null; if (expressions.Any()) { var exp_p = Expression.Parameter(typeof(TItem)); var visitor = new ComboExpressionVisitor(exp_p); foreach (var exp in expressions) { if (ret == null) { ret = exp; continue; } var left = visitor.Visit(ret.Body); var right = visitor.Visit(exp.Body); ret = logic == FilterLogic.And ? Expression.Lambda <Func <TItem, bool> >(Expression.AndAlso(left, right), exp_p) : Expression.Lambda <Func <TItem, bool> >(Expression.OrElse(left, right), exp_p); } } return(ret ?? (r => true)); }