private Expression GetConjuction(ParserContext ctx) { skipWhiteSpace(ctx); var a = GetNegation(ctx); while (ctx.CurrentPosition != ctx.Text.Length && skipCharacter('&', ctx)) { a = new Conjuction(a, GetNegation(ctx)); } skipWhiteSpace(ctx); return(a); }
/// <summary> /// 增加逻辑连接符 /// </summary> /// <param name="logicOperator"></param> public virtual void AddLogicOperator(Conjuction logicOperator) { if (lastIsConjuction) { return; } string paramStr = ""; if (logicOperator == Conjuction.And) { paramStr = " and"; } else if (logicOperator == Conjuction.Or) { paramStr = " or"; } this.ItemList.Add(logicOperator); this.filterSQLString += paramStr; lastIsConjuction = true; }
/// <summary> /// 表达式类型转换 连接类型 /// </summary> /// <param name="expType">表达式连接类型</param> /// <returns></returns> private Conjuction GetConjuction(ExpressionType expType) { Conjuction conjuction = Conjuction.None; switch (expType) { case ExpressionType.And: case ExpressionType.AndAlso: conjuction = Conjuction.And; break; case ExpressionType.Or: case ExpressionType.OrElse: conjuction = Conjuction.Or; break; default: throw new Exception("表达式间连接类型无效:" + expType.ToString()); } return(conjuction); }
/// <summary> /// 增加查询项 /// </summary> /// <param name="fieldName"></param> /// <param name="conjuction"></param> /// <param name="operand"></param> /// <param name="value"></param> public virtual void AddQueryItem(string fieldName, Conjuction conjuction, Operand operand, object value, DbType dbType) { QueryParameter p = new QueryParameter(); p.FieldName = fieldName; p.ParameterValue = value; p.ParameterDbType = dbType; p.Op = operand; p.Conj = conjuction; string whereClause = ""; switch (p.Op) { case Operand.Equal: p.ParameterName = GetParameterName(fieldName); this.filterParameters.Add(p); whereClause += " " + p.FieldName + " = " + p.ParameterName; break; case Operand.NotEqual: p.ParameterName = GetParameterName(fieldName); this.filterParameters.Add(p); whereClause += " " + p.FieldName + "<>" + p.ParameterName; break; case Operand.GreaterThan: p.ParameterName = GetParameterName(fieldName); this.filterParameters.Add(p); whereClause += " " + p.FieldName + ">" + p.ParameterName; break; case Operand.LessThan: p.ParameterName = GetParameterName(fieldName); this.filterParameters.Add(p); whereClause += " " + p.FieldName + "<" + p.ParameterName; break; case Operand.LessThanOrEqual: p.ParameterName = GetParameterName(fieldName); this.filterParameters.Add(p); whereClause += " " + p.FieldName + "<=" + p.ParameterName; break; case Operand.GreaterThanOrEqual: p.ParameterName = GetParameterName(fieldName); this.filterParameters.Add(p); whereClause += " " + p.FieldName + ">=" + p.ParameterName; break; case Operand.Like: p.ParameterName = GetParameterName(fieldName); p.ParameterValue = string.Format("%{0}%", p.ParameterValue); this.filterParameters.Add(p); whereClause += " " + p.FieldName + " like " + p.ParameterName; break; case Operand.RightLike: p.ParameterName = GetParameterName(fieldName); p.ParameterValue = string.Format("%{0}", p.ParameterValue); this.filterParameters.Add(p); whereClause += " " + p.FieldName + " like " + p.ParameterName; break; case Operand.LeftLike: p.ParameterName = GetParameterName(fieldName); p.ParameterValue = string.Format("{0}%", p.ParameterValue); this.filterParameters.Add(p); whereClause += " " + p.FieldName + " like " + p.ParameterName; break; case Operand.NotLike: p.ParameterName = GetParameterName(fieldName); p.ParameterValue = string.Format("%{0}%", p.ParameterValue); this.filterParameters.Add(p); whereClause += " " + p.FieldName + " not like " + p.ParameterName; break; case Operand.Contains: whereClause += " Contains ( " + p.FieldName + " , " + p.ParameterName + " )"; break; case Operand.IsNull: whereClause += " " + p.FieldName + " is null"; break; case Operand.IsNotNull: whereClause += " " + p.FieldName + " is not null"; break; case Operand.In: //in 需要参数格式 @p1, @p2, @p3,... p.ParameterName = AddInParam(fieldName, value, dbType); if (!string.IsNullOrEmpty(p.ParameterName)) { //判断参数有效 此条件有效 whereClause += " " + p.FieldName + " in (" + p.ParameterName + ") "; } else { //如果 in条件为空. 返回空列表 whereClause += " 1 = 0"; } break; case Operand.NotIn: p.ParameterName = AddInParam(fieldName, value, dbType); if (!string.IsNullOrEmpty(p.ParameterName)) { //判断参数有效 此条件有效 whereClause += " " + p.FieldName + " not in (" + p.ParameterName + ") "; } else { //如参数为空,忽略此参数 返回所有 } break; case Operand.FieldEqual: whereClause += " " + p.FieldName + " = " + p.ParameterValue.ToString(); break; case Operand.FieldGreaterThan: whereClause += " " + p.FieldName + " > " + p.ParameterValue.ToString(); break; case Operand.FieldLessThan: whereClause += " " + p.FieldName + " < " + p.ParameterValue.ToString(); break; case Operand.FieldGreaterThanOrEqual: whereClause += " " + p.FieldName + " >= " + p.ParameterValue.ToString(); break; case Operand.FieldLessThanOrEqual: whereClause += " " + p.FieldName + " <= " + p.ParameterValue.ToString(); break; } if (!lastIsConjuction) { string conjuctionStr = ""; if (p.Conj == Conjuction.And) { conjuctionStr = " and"; } else if (p.Conj == Conjuction.Or) { conjuctionStr = " or"; } this.filterSQLString += conjuctionStr; } if (!string.IsNullOrEmpty(whereClause)) { this.filterSQLString += whereClause; this.ItemList.Add(p); lastIsConjuction = false; } }
/// <summary> /// 增加查询项 /// </summary> /// <param name="fieldName"></param> /// <param name="conjuction"></param> /// <param name="operand"></param> /// <param name="compareValue"></param> /// <returns></returns> public virtual void AddQueryItem(string fieldName, Conjuction conjuction, Operand operand, object compareValue) { AddQueryItem(fieldName, conjuction, operand, compareValue, DbTypeConvertor.GetDbType(compareValue)); }