DbExpression VisistDbBooleanExpression(DbExpression exp) { DbCaseWhenExpression caseWhenExpression = SqlGenerator.ConstructReturnCSharpBooleanCaseWhenExpression(exp); this.Visit(caseWhenExpression); return(exp); }
public static DbCaseWhenExpression ConstructReturnCSharpBooleanCaseWhenExpression(DbExpression exp) { // case when 1>0 then 1 when not (1>0) then 0 else Null end DbCaseWhenExpression.WhenThenExpressionPair whenThenPair = new DbCaseWhenExpression.WhenThenExpressionPair(exp, DbConstantExpression.True); DbCaseWhenExpression.WhenThenExpressionPair whenThenPair1 = new DbCaseWhenExpression.WhenThenExpressionPair(DbExpression.Not(exp), DbConstantExpression.False); List<DbCaseWhenExpression.WhenThenExpressionPair> whenThenExps = new List<DbCaseWhenExpression.WhenThenExpressionPair>(2); whenThenExps.Add(whenThenPair); whenThenExps.Add(whenThenPair1); DbCaseWhenExpression caseWhenExpression = DbExpression.CaseWhen(whenThenExps, DbConstantExpression.Null, UtilConstants.TypeOfBoolean); return caseWhenExpression; }
public void Process(DbMethodCallExpression exp, SqlGenerator generator) { List <WhenThenExpressionPair> pairs = new List <WhenThenExpressionPair>(); GetWhenThenPairs(exp.Object as DbMethodCallExpression, pairs); pairs.Reverse(); List <WhenThenExpressionPair> whenThenPairs = pairs; DbExpression elseExp = exp.Arguments[0]; DbCaseWhenExpression caseWhenExp = new DbCaseWhenExpression(exp.Type, whenThenPairs, elseExp); caseWhenExp.Accept(generator); }
public override DbExpression Visit(DbCaseWhenExpression exp) { this._sqlBuilder.Append("CASE"); foreach (var whenThen in exp.WhenThenPairs) { this._sqlBuilder.Append(" WHEN "); whenThen.When.Accept(this); this._sqlBuilder.Append(" THEN "); whenThen.Then.Accept(this); } this._sqlBuilder.Append(" ELSE "); exp.Else.Accept(this); this._sqlBuilder.Append(" END"); return(exp); }
// then 部分必须返回 C# type,所以得判断是否是诸如 a>1,a=b,in,like 等等的情况,如果是则将其构建成一个 case when public override DbExpression Visit(DbCaseWhenExpression exp) { this._sqlBuilder.Append("CASE"); foreach (var whenThen in exp.WhenThenPairs) { // then 部分得判断是否是诸如 a>1,a=b,in,like 等等的情况,如果是则将其构建成一个 case when this._sqlBuilder.Append(" WHEN "); whenThen.When.Accept(this); this._sqlBuilder.Append(" THEN "); EnsureDbExpressionReturnCSharpBoolean(whenThen.Then).Accept(this); } this._sqlBuilder.Append(" ELSE "); EnsureDbExpressionReturnCSharpBoolean(exp.Else).Accept(this); this._sqlBuilder.Append(" END"); return(exp); }
public void Process(DbMethodCallExpression exp, SqlGenerator generator) { DbExpression e = exp.Arguments.First(); DbEqualExpression equalNullExpression = DbExpression.Equal(e, DbExpression.Constant(null, UtilConstants.TypeOfString)); DbEqualExpression equalEmptyExpression = DbExpression.Equal(e, DbExpression.Constant(string.Empty)); DbOrExpression orExpression = DbExpression.Or(equalNullExpression, equalEmptyExpression); DbCaseWhenExpression.WhenThenExpressionPair whenThenPair = new DbCaseWhenExpression.WhenThenExpressionPair(orExpression, DbConstantExpression.One); List<DbCaseWhenExpression.WhenThenExpressionPair> whenThenExps = new List<DbCaseWhenExpression.WhenThenExpressionPair>(1); whenThenExps.Add(whenThenPair); DbCaseWhenExpression caseWhenExpression = DbExpression.CaseWhen(whenThenExps, DbConstantExpression.Zero, UtilConstants.TypeOfBoolean); var eqExp = DbExpression.Equal(caseWhenExpression, DbConstantExpression.One); eqExp.Accept(generator); }
DbExpression ConvertDbBooleanExpression(DbExpression exp) { DbCaseWhenExpression caseWhenExpression = SqlGenerator.ConstructReturnCSharpBooleanCaseWhenExpression(exp); return(caseWhenExpression); }
public override DbExpression Visit(DbCaseWhenExpression exp) { return(exp); }
static void StringConcat(DbBinaryExpression exp, SqlGenerator generator) { MethodInfo method = exp.Method; 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.AndAlso(whenExp, equalNullExp); } DbExpression thenExp = DbConstantExpression.StringEmpty; DbCaseWhenExpression.WhenThenExpressionPair whenThenPair = new DbCaseWhenExpression.WhenThenExpressionPair(equalNullExp, thenExp); List <DbCaseWhenExpression.WhenThenExpressionPair> whenThenExps = new List <DbCaseWhenExpression.WhenThenExpressionPair>(1); whenThenExps.Add(whenThenPair); DbExpression elseExp = opBody; DbCaseWhenExpression caseWhenExpression = DbExpression.CaseWhen(whenThenExps, elseExp, UtilConstants.TypeOfString); operandExps.Add(caseWhenExpression); } 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(" || "); } operandExps[i].Accept(generator); } generator._sqlBuilder.Append(")"); generator._sqlBuilder.Append(" END"); }
public override DbExpression Visit(DbCaseWhenExpression exp) { return(exp.Accept(this._generator)); }
public abstract T Visit(DbCaseWhenExpression exp);