/// <summary> /// 解析非表达式,生成sql条件表达式节点及其附属的sql参数 /// </summary> /// <param name="parameterExpression">Lambda表达式的参数</param> /// <param name="bodyExpression">Lambda表达式的主体(或主体的一部分)</param> /// <param name="parameterNames">记录不允许重复的sql参数名称</param> /// <returns>sql条件表达式节点及其附属的sql参数</returns> public override KeyValuePair <INodeBuilder, IDbDataParameter[]> Visit(ParameterExpression parameterExpression, Expression bodyExpression, HashSet <string> parameterNames) { //获取一元表达式并检查该表达式是否满足解析条件 UnaryExpression unaryExpression = bodyExpression as UnaryExpression; if (unaryExpression.Operand == null) { throw new Exception(string.Format("Unknow Expression:{0}", unaryExpression.ToString())); } switch (unaryExpression.Operand.NodeType) { case ExpressionType.Equal: case ExpressionType.NotEqual: case ExpressionType.Call: break; default: throw new Exception(string.Format("Unknow Expression:{0}", unaryExpression.ToString())); } //获取sql语句模板 WhereVisitor whereVisitor = this._factory.GetVisitor(unaryExpression.Operand.NodeType); KeyValuePair <INodeBuilder, IDbDataParameter[]> sqlBuilderPair = whereVisitor.Visit(parameterExpression, unaryExpression.Operand, parameterNames); StringBuilder sqlTemplate = new StringBuilder(); sqlBuilderPair.Key.Build(sqlTemplate); //替换sql语句模板中的操作符为相反类型的操作符(如LIKE 替换为NOT LIKE) string baseSqlTemplate = sqlTemplate.ToString(); if (baseSqlTemplate.Contains("LIKE")) { sqlTemplate.Replace("LIKE", "NOT LIKE"); } if (baseSqlTemplate.Contains(" = ")) { sqlTemplate.Replace(" = ", " <> "); } if (baseSqlTemplate.Contains(" != ")) { sqlTemplate.Replace(" != ", " = "); } if (baseSqlTemplate.Contains("IS NULL")) { sqlTemplate.Replace("IS NULL", "IS NOT NULL"); } if (baseSqlTemplate.Contains("IS NOT NULL")) { sqlTemplate.Replace("IS NOT NULL", "IS NULL"); } if (baseSqlTemplate.Contains("IN")) { sqlTemplate.Replace("IN", "NOT IN"); } //获取sql表达式 INodeBuilder nodeBuilder = new NodeBuilder(SqlType.Where, sqlTemplate.ToString()); //返回sql表达式及其附属的sql参数集合 return(new KeyValuePair <INodeBuilder, IDbDataParameter[]>(nodeBuilder, sqlBuilderPair.Value)); }
/// <summary> /// 解析查询条件表达式,生成sql条件表达式节点及其附属的sql参数 /// </summary> /// <param name="parameterExpression">Lambda表达式的参数</param> /// <param name="bodyExpression">Lambda表达式的主体(或主体的一部分)</param> /// <param name="parameterNames">记录不允许重复的sql参数名称</param> /// <returns>sql条件表达式节点及其附属的sql参数</returns> public override KeyValuePair <INodeBuilder, IDbDataParameter[]> Visit(ParameterExpression parameterExpression, Expression bodyExpression, HashSet <string> parameterNames) { //获取二叉树表达式 BinaryExpression binaryExpression = bodyExpression as BinaryExpression; //获取左sql表达式及其附属参数 WhereVisitor leftVisitor = this._factory.GetVisitor(binaryExpression.Left.NodeType); KeyValuePair <INodeBuilder, IDbDataParameter[]> leftPair = leftVisitor.Visit(parameterExpression, binaryExpression.Left, parameterNames); //获取右sql表达式及其附属参数 WhereVisitor rightVisitor = this._factory.GetVisitor(binaryExpression.Right.NodeType); KeyValuePair <INodeBuilder, IDbDataParameter[]> rightPair = rightVisitor.Visit(parameterExpression, binaryExpression.Right, parameterNames); //获取最终的sql条件表达式节点 INodeBuilder nodeBuilder = new BinaryBuilder() { LeftBuilder = leftPair.Key, NodeType = binaryExpression.NodeType, RightBuilder = rightPair.Key }; //获取其附属参数 IDbDataParameter[] sqlParameters = leftPair.Value.Concat(rightPair.Value).ToArray(); //返回最终的sql表达式及其附属参数 return(new KeyValuePair <INodeBuilder, IDbDataParameter[]>(nodeBuilder, sqlParameters)); }