/// <summary> /// 扩展单个And条件 /// </summary> /// <typeparam name="T"></typeparam> /// <param name="query"></param> /// <param name="condition"></param> /// <returns></returns> public static IQueryable <T> QueryAndSingleOr <T>(this IQueryable <T> query, UosoConditions condition) { if (condition == null) { return(query); } var parser = new UosoExpressionParser <T>(); var filter = parser.AndGroupOr(new List <UosoConditions> { condition }); return(query.Where(filter)); }
/// <summary> /// 处理特殊的In条件 /// </summary> /// <param name="parameter"></param> /// <param name="conditions"></param> /// <returns></returns> private Expression ParaseIn(ParameterExpression parameter, UosoConditions conditions) { ParameterExpression p = parameter; Expression key = Expression.Property(p, conditions.Key); var valueArr = conditions.Value.ToString().Split(','); Expression expression = Expression.Constant(true, typeof(bool)); foreach (var itemVal in valueArr) { Expression value = Expression.Constant(itemVal); Expression right = Expression.Equal(key, Expression.Convert(value, key.Type)); Expression.Or(expression, right); } return(expression); }
/// <summary> /// 处理特殊的Between /// </summary> /// <param name="parameter"></param> /// <param name="conditions"></param> /// <returns></returns> private Expression ParaseBetween(ParameterExpression parameter, UosoConditions conditions) { ParameterExpression p = parameter; Expression key = Expression.Property(p, conditions.Key); var valueArr = conditions.Value.ToString().Split(','); if (valueArr.Length != 2) { throw new NotImplementedException("ParaseBetween参数错误"); } Expression startvalue = null; Expression endvalue = null; try { if (conditions.ValueType.ToLower() == "datetime") { startvalue = Expression.Constant(DateTime.Parse(valueArr[0])); endvalue = Expression.Constant(DateTime.Parse(valueArr[1])); } if (conditions.ValueType.ToLower() == "int") { startvalue = Expression.Constant(int.Parse(valueArr[0])); endvalue = Expression.Constant(int.Parse(valueArr[1])); } } catch { throw new NotImplementedException("ParaseBetween参数不支持此类型"); } Expression expression = Expression.Constant(true, typeof(bool)); //开始位置 Expression start = Expression.GreaterThanOrEqual(key, Expression.Convert(startvalue, key.Type)); Expression end = Expression.GreaterThanOrEqual(key, Expression.Convert(endvalue, key.Type)); return(Expression.AndAlso(start, end)); }
/// <summary> /// 组装赋值参数转化成表达式 /// </summary> /// <param name="condition"></param> /// <returns></returns> public Expression ParseCondition(UosoConditions condition) { ParameterExpression p = parameter; Expression key = Expression.Property(p, condition.Key); Expression value; switch (condition.ValueType.ToLower()) { case "int": value = Expression.Constant(int.Parse(condition.Value));; break; case "float": value = Expression.Constant(float.Parse(condition.Value)); break; case "double": value = Expression.Constant(double.Parse(condition.Value)); break; case "decimal": value = Expression.Constant(decimal.Parse(condition.Value)); break; case "time": value = Expression.Constant(DateTime.Parse(condition.Value)); break; case "datetime": value = Expression.Constant(DateTime.Parse(condition.Value)); break; case "string": value = Expression.Constant(condition.Value); break; case "enum": value = Expression.Constant(Enum.Parse(typeof(Enum), condition.Value)); break; case "boolean": value = Expression.Constant(Boolean.Parse(condition.Value)); break; default: throw new NotSupportedException(string.Format(condition.ValueType, "ValueType类型: {0} 不支持")); } switch (condition.Operator) { case UosoOperatorEnum.Contains: return(Expression.Call(key, typeof(string).GetMethod("Contains", new Type[] { typeof(string) }), value)); case UosoOperatorEnum.Equal: return(Expression.Equal(key, Expression.Convert(value, key.Type))); case UosoOperatorEnum.Greater: return(Expression.GreaterThan(key, Expression.Convert(value, key.Type))); case UosoOperatorEnum.GreaterEqual: return(Expression.GreaterThanOrEqual(key, Expression.Convert(value, key.Type))); case UosoOperatorEnum.Less: return(Expression.LessThan(key, Expression.Convert(value, key.Type))); case UosoOperatorEnum.LessEqual: return(Expression.LessThanOrEqual(key, Expression.Convert(value, key.Type))); case UosoOperatorEnum.NotEqual: return(Expression.NotEqual(key, Expression.Convert(value, key.Type))); case UosoOperatorEnum.In: return(ParaseIn(p, condition)); case UosoOperatorEnum.Between: return(ParaseBetween(p, condition)); default: throw new NotImplementedException("不支持此操作"); } }