/// <summary>
        /// 创建Sql查询条件
        /// </summary>
        /// <param name="left">左操作数</param>
        /// <param name="right">右操作数</param>
        /// <param name="operator">操作符</param>
        public static Abstractions.ICondition Create <TEntity>(QueryContainerDescriptor <TEntity> queryContainerDescriptor, string column, object obj, Operator @operator) where TEntity : class
        {
            var func = Lambda.CreateExpression <TEntity>(column);

            switch (@operator)
            {
            case Operator.Equal:
                if (obj == null)
                {
                    return(new MississCondition(new ExistsCondition <TEntity>(queryContainerDescriptor, column)));
                }
                return(new TermCondition <TEntity>(queryContainerDescriptor, GetFuncObject <TEntity>(column), obj));

            case Operator.NotEqual:
                if (obj == null)
                {
                    return(new ExistsCondition <TEntity>(queryContainerDescriptor, column));
                }
                var left = new TermCondition <TEntity>(queryContainerDescriptor, GetFuncObject <TEntity>(column), obj);
                return(new MustNotCondition(left));

            case Operator.Greater:
            case Operator.Less:
            case Operator.GreaterEqual:
            case Operator.LessEqual:
                var type = obj.GetType();
                type = Common.GetType(type);
                return(GetRangeCondition(type, queryContainerDescriptor, GetFuncObject <TEntity>(column), obj, @operator));

            case Operator.Contains:
                return(new MatchPhraseCondition <TEntity>(queryContainerDescriptor, GetFuncObject <TEntity>(column), obj));

            case Operator.Starts:
                return(new PrefixCondition <TEntity>(queryContainerDescriptor, GetFuncObject <TEntity>(column), obj));

            case Operator.In:
                return(CreateInCondition <TEntity>(queryContainerDescriptor, column, obj as IEnumerable));

            case Operator.NotIn:
                return(CreateInCondition <TEntity>(queryContainerDescriptor, column, obj as IEnumerable, true));
                //case Operator.Ends:
                //    return new LikeCondition(left, right); //SUFFIX
            }
            throw new NotImplementedException($"运算符 {@operator.Description()} 未实现");
        }
        public LongRangeCondition(QueryContainerDescriptor <TEntity> queryContainerDescriptor, Expression <Func <TEntity, object> > expField, long value, Operator @operator)
        {
            _queryContainerDescriptor = queryContainerDescriptor;
            switch (@operator)
            {
            case Operator.Greater:
                _expression = qd => qd.Field(expField).GreaterThan(value);
                break;

            case Operator.GreaterEqual:
                _expression = qd => qd.Field(expField).GreaterThanOrEquals(value);
                break;

            case Operator.Less:
                _expression = qd => qd.Field(expField).LessThan(value);
                break;

            case Operator.LessEqual:
                _expression = qd => qd.Field(expField).LessThanOrEquals(value);
                break;

            default:
                throw new NotImplementedException($"{@operator} 未实现");
            }
        }
        private static Abstractions.ICondition GetRangeCondition <TEntity>(Type type, QueryContainerDescriptor <TEntity> queryContainerDescriptor, Expression <Func <TEntity, object> > expField, object obj, Operator @operator) where TEntity : class
        {
            switch (type.Name)
            {
            case "Int32":
            case "Int64":
                return(new LongRangeCondition <TEntity>(queryContainerDescriptor, expField, Util.Helpers.Convert.ToLong(obj), @operator));

            case "Double":
            case "Decimal":
                return(new NumericRangeCondition <TEntity>(queryContainerDescriptor, expField, Util.Helpers.Convert.ToDouble(obj), @operator));

            case "DateTime":
                return(new DateRangeCondition <TEntity>(queryContainerDescriptor, expField, (DateTime)obj, @operator));
            }
            throw new NotImplementedException($"运算符 {@operator.Description()} 类型 {type.Name} 未实现");
        }