/// <summary>
        /// 构造搜索条件组的表达式(一个组中可能包含若干子条件组)
        /// </summary>
        /// <typeparam name="T">搜索的对象类型</typeparam>
        /// <param name="group">条件组</param>
        /// <param name="parameter">参数表达式</param>
        /// <param name="propertyMap">属性映射</param>
        /// <returns>返回bool的条件组的表达式</returns>
        private static Expression BuildGroupExpression <T>(FilterRuleGroup group, ParameterExpression parameter, IDictionary <string, string> propertyMap)
        {
            List <Expression> expressions = new List <Expression>();

            foreach (var rule in group.Rules ?? new FilterRule[0])
            {
                expressions.Add(BuildRuleExpression <T>(rule, parameter, propertyMap));
            }

            foreach (var subGroup in group.Groups ?? new FilterRuleGroup[0])
            {
                expressions.Add(BuildGroupExpression <T>(subGroup, parameter, propertyMap));
            }

            if (expressions.Count == 0)
            {
                throw new InvalidOperationException("构造where子句异常,生成了0个比较条件表达式。");
            }

            if (expressions.Count == 1)
            {
                return(expressions[0]);
            }

            var expression = expressions[0];

            switch (group.GroupOprator)
            {
            case FilterRuleGroupOprator.AndAlso:
                foreach (var exp in expressions.Skip(1))
                {
                    expression = Expression.AndAlso(expression, exp);
                }
                break;

            case FilterRuleGroupOprator.OrElse:
                foreach (var exp in expressions.Skip(1))
                {
                    expression = Expression.OrElse(expression, exp);
                }
                break;

            default:
                throw new InvalidOperationException($"不支持创建{group.GroupOprator}类型的逻辑运算表达式");
            }

            return(expression);
        }
        //前端的(不)属于条件搜索需要传递一个json数组的字符串作为参数
        //为了避免在搜索字符串的时候分隔符是搜索内容的一部分导致搜索关键字出错
        //无论定义什么分隔符都不能完全避免这种尴尬的情况,所以使用标准的json以绝后患
        /// <summary>
        /// 根据搜索条件构造where表达式,支持JqGrid高级搜索
        /// </summary>
        /// <typeparam name="T">搜索的对象类型</typeparam>
        /// <param name="ruleGroup">JqGrid搜索条件组</param>
        /// <param name="propertyMap">属性映射,把搜索规则的名称映射到属性名称,如果属性是复杂类型,使用点号可以继续访问内部属性</param>
        /// <returns>where表达式</returns>
        public static Expression <Func <T, bool> > BuildWhere <T>(this FilterRuleGroup ruleGroup, IDictionary <string, string> propertyMap = null)
        {
            ParameterExpression parameter = Expression.Parameter(typeof(T), "searchObject");

            return(Expression.Lambda <Func <T, bool> >(BuildGroupExpression <T>(ruleGroup, parameter, propertyMap), parameter));
        }