/// <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));
        }
Exemplo n.º 2
0
    /// <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));
    }