// + public override DbExpression Visit(DbAddExpression exp) { MethodInfo method = exp.Method; if (method != null) { Action<DbBinaryExpression, SqlGenerator> handler; if (BinaryWithMethodHandlers.TryGetValue(method, out handler)) { handler(exp, this); return exp; } } Stack<DbExpression> operands = GatherBinaryExpressionOperand(exp); this.ConcatOperands(operands, " + "); return exp; }
static void StringConcat(DbBinaryExpression exp, SqlGenerator generator) { List <DbExpression> operands = new List <DbExpression>(); operands.Add(exp.Right); DbExpression left = exp.Left; DbAddExpression e = null; while ((e = (left as DbAddExpression)) != null && (e.Method == UtilConstants.MethodInfo_String_Concat_String_String || e.Method == UtilConstants.MethodInfo_String_Concat_Object_Object)) { operands.Add(e.Right); left = e.Left; } operands.Add(left); DbExpression whenExp = null; List <DbExpression> operandExps = new List <DbExpression>(operands.Count); for (int i = operands.Count - 1; i >= 0; i--) { DbExpression operand = operands[i]; DbExpression opBody = operand; if (opBody.Type != UtilConstants.TypeOfString) { // 需要 cast type opBody = DbExpression.Convert(opBody, UtilConstants.TypeOfString); } DbExpression equalNullExp = DbExpression.Equal(opBody, UtilConstants.DbConstant_Null_String); if (whenExp == null) { whenExp = equalNullExp; } else { whenExp = DbExpression.And(whenExp, equalNullExp); } operandExps.Add(opBody); } generator._sqlBuilder.Append("CASE", " WHEN "); whenExp.Accept(generator); generator._sqlBuilder.Append(" THEN "); DbConstantExpression.Null.Accept(generator); generator._sqlBuilder.Append(" ELSE "); generator._sqlBuilder.Append("("); for (int i = 0; i < operandExps.Count; i++) { if (i > 0) { generator._sqlBuilder.Append(" + "); } generator._sqlBuilder.Append("ISNULL("); operandExps[i].Accept(generator); generator._sqlBuilder.Append(","); DbConstantExpression.StringEmpty.Accept(generator); generator._sqlBuilder.Append(")"); } generator._sqlBuilder.Append(")"); generator._sqlBuilder.Append(" END"); }
// + public override DbExpression Visit(DbAddExpression exp) { return(exp); }
// + public override DbExpression Visit(DbAddExpression exp) { return(exp.Accept(this._generator)); }
// + public abstract T Visit(DbAddExpression exp);