Пример #1
0
        /// <summary>And操作</summary>
        /// <param name="exp"></param>
        /// <returns></returns>
        public WhereExpression And(Expression exp)
        {
            if (exp != null)
            {
                // 如果前面有Or,则整体推入下一层
                if (Expressions.Any(e => !e.IsAnd))
                {
                    var where = new WhereExpression();
                    where.Expressions.AddRange(Expressions);

                    Expressions.Clear();
                    Expressions.Add(new ExpItem(true, where));
                }

                Expressions.Add(new ExpItem(true, exp));
            }

            return this;
        }
Пример #2
0
        /// <summary>输出条件表达式的字符串表示,遍历表达式集合并拼接起来</summary>
        /// <param name="needBracket">外部是否需要括号。如果外部要求括号,而内部又有Or,则加上括号</param>
        /// <param name="ps">参数字典</param>
        /// <returns></returns>
        public override String GetString(Boolean needBracket, IDictionary <String, Object> ps)
        {
            var exps = Exps;

            if (exps.Count == 0)
            {
                return(null);
            }

            // 重整表达式
            var list = new List <ExpItem>();
            var sub  = new List <ExpItem>();

            var hasOr = false;

            // 优先计算And,所有And作为一个整体表达式进入内层,处理完以后当前层要么全是And,要么全是Or
            for (Int32 i = 0; i < exps.Count; i++)
            {
                sub.Add(exps[i]);
                // 如果下一个是Or,或者已经是最后一个,则合并sub到list
                if (i < exps.Count - 1 && !exps[i + 1].IsAnd || i == exps.Count - 1)
                {
                    // sub创建新exp加入list
                    // 一个就不用创建了
                    if (sub.Count == 1)
                    {
                        list.Add(sub[0]);
                        if (list.Count > 0 && !sub[0].IsAnd)
                        {
                            hasOr = true;
                        }
                    }
                    else if (i == exps.Count - 1 && list.Count == 0)
                    {
                        list.AddRange(sub);
                    }
                    else
                    {
                        // 这一片And凑成一个子表达式
                        var where = new WhereExpression();
                        where.Exps.AddRange(sub);
                        list.Add(new ExpItem(false, where));
                        hasOr = true;
                    }

                    sub.Clear();
                }
            }
            // 第一个表达式的And/Or必须正确代表本层所有表达式
            list[0].IsAnd = !hasOr;

            // 开始计算
            var sb = new StringBuilder();

            for (Int32 i = 0; i < list.Count; i++)
            {
                var item = list[i];
                var exp  = item.Exp;
                //exp.Strict = Strict;

                // 里面是Or的时候,外面前后任意一个And,需要括号
                var str = exp.GetString(item.IsAnd || i < list.Count - 1 && list[i + 1].IsAnd, ps);
                // 跳过没有返回的表达式
                if (str.IsNullOrWhiteSpace())
                {
                    continue;
                }

                if (sb.Length > 0)
                {
                    sb.AppendFormat(" {0} ", item.IsAnd ? "And" : "Or");
                    // 不能判断第一个,控制符可能不正确
                    if (!item.IsAnd)
                    {
                        hasOr = true;
                    }
                }
                sb.Append(str);
            }

            if (sb.Length == 0)
            {
                return(null);
            }
            if (needBracket && hasOr)
            {
                return("({0})".F(sb.ToString()));
            }
            return(sb.ToString());
        }
Пример #3
0
        /// <summary>输出条件表达式的字符串表示,遍历表达式集合并拼接起来</summary>
        /// <param name="needBracket">外部是否需要括号。如果外部要求括号,而内部又有Or,则加上括号</param>
        /// <returns></returns>
        public override String GetString(Boolean needBracket = false)
        {
            var exps = Expressions;
            if (exps.Count == 0) return null;

            // 重整表达式
            var list = new List<ExpItem>();
            var sub = new List<ExpItem>();

            var hasOr = false;
            // 优先计算And,所有And作为一个整体表达式进入内层,处理完以后当前层要么全是And,要么全是Or
            for (int i = 0; i < exps.Count; i++)
            {
                sub.Add(exps[i]);
                // 如果下一个是Or,或者已经是最后一个,则合并sub到list
                if (i < exps.Count - 1 && !exps[i + 1].IsAnd || i == exps.Count - 1)
                {
                    // sub创建新exp加入list
                    // 一个就不用创建了
                    if (sub.Count == 1)
                    {
                        list.Add(sub[0]);
                        if (list.Count > 0 && !sub[0].IsAnd) hasOr = true;
                    }
                    else if (i == exps.Count - 1 && list.Count == 0)
                        list.AddRange(sub);
                    else
                    {
                        // 这一片And凑成一个子表达式
                        var where = new WhereExpression();
                        where.Expressions.AddRange(sub);
                        list.Add(new ExpItem(false, where));
                        hasOr = true;
                    }

                    sub.Clear();
                }
            }
            // 第一个表达式的And/Or必须正确代表本层所有表达式
            list[0].IsAnd = !hasOr;

            // 开始计算
            var sb = new StringBuilder();
            for (int i = 0; i < list.Count; i++)
            {
                var item = list[i];
                var exp = item.Exp;
                exp.Strict = Strict;

                // 里面是Or的时候,外面前后任意一个And,需要括号
                var str = exp.GetString(item.IsAnd || i < list.Count - 1 && list[i + 1].IsAnd);
                // 跳过没有返回的表达式
                if (str.IsNullOrWhiteSpace()) continue;

                if (sb.Length > 0)
                {
                    sb.AppendFormat(" {0} ", item.IsAnd ? "And" : "Or");
                    // 不能判断第一个,控制符可能不正确
                    if (!item.IsAnd) hasOr = true;
                }
                sb.Append(str);
            }

            if (sb.Length == 0) return null;
            if (needBracket && hasOr) return "({0})".F(sb.ToString());
            return sb.ToString();
        }