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} 未实现"); }
/// <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()} 未实现"); }