internal override SqlExpression VisitDiscriminatorOf(SqlDiscriminatorOf dof) { return(new SqlDiscriminatorOf(this.VisitExpression(dof.Object), dof.ClrType, dof.SqlType, dof.SourceExpression)); }
internal virtual SqlExpression VisitDiscriminatorOf(SqlDiscriminatorOf dof) { dof.Object = this.VisitExpression(dof.Object); return(dof); }
internal override SqlExpression VisitMethodCall(SqlMethodCall mc) { mc.Object = this.VisitExpression(mc.Object); int num = 0; int count = mc.Arguments.Count; while (num < count) { mc.Arguments[num] = this.VisitExpression(mc.Arguments[num]); num++; } if (mc.Method.IsStatic) { if ((mc.Method.Name == "Equals") && (mc.Arguments.Count == 2)) { return(this.sql.Binary(SqlNodeType.EQ2V, mc.Arguments[0], mc.Arguments[1], mc.Method)); } if ((mc.Method.DeclaringType == typeof(string)) && (mc.Method.Name == "Concat")) { SqlExpression expression; var array = mc.Arguments[0] as SqlClientArray; var expressions = array != null ? array.Expressions : mc.Arguments; if (expressions.Count == 0) { return(this.sql.ValueFromObject("", false, mc.SourceExpression)); } if (expressions[0].SqlType.IsString || expressions[0].SqlType.IsChar) { expression = expressions[0]; } else { expression = this.sql.ConvertTo(typeof(string), expressions[0]); } for (int i = 1; i < expressions.Count; i++) { if (expressions[i].SqlType.IsString || expressions[i].SqlType.IsChar) { expression = this.sql.Concat(new SqlExpression[] { expression, expressions[i] }, mc.SourceExpression); } else { expression = this.sql.Concat(new SqlExpression[] { expression, this.sql.ConvertTo(typeof(string), expressions[i]) }, mc.SourceExpression); } } return(expression); } if (PreBindDotNetConverter.IsVbIIF(mc)) { return(this.TranslateVbIIF(mc)); } switch (mc.Method.Name) { case "op_Equality": return(this.sql.Binary(SqlNodeType.EQ, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_Inequality": return(this.sql.Binary(SqlNodeType.NE, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_LessThan": return(this.sql.Binary(SqlNodeType.LT, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_LessThanOrEqual": return(this.sql.Binary(SqlNodeType.LE, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_GreaterThan": return(this.sql.Binary(SqlNodeType.GT, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_GreaterThanOrEqual": return(this.sql.Binary(SqlNodeType.GE, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_Multiply": return(this.sql.Binary(SqlNodeType.Mul, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_Division": return(this.sql.Binary(SqlNodeType.Div, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_Subtraction": return(this.sql.Binary(SqlNodeType.Sub, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_Addition": return(this.sql.Binary(SqlNodeType.Add, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_Modulus": return(this.sql.Binary(SqlNodeType.Mod, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_BitwiseAnd": return(this.sql.Binary(SqlNodeType.BitAnd, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_BitwiseOr": return(this.sql.Binary(SqlNodeType.BitOr, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_ExclusiveOr": return(this.sql.Binary(SqlNodeType.BitXor, mc.Arguments[0], mc.Arguments[1], mc.Method, mc.ClrType)); case "op_UnaryNegation": return(this.sql.Unary(SqlNodeType.Negate, mc.Arguments[0], mc.Method, mc.SourceExpression)); case "op_OnesComplement": return(this.sql.Unary(SqlNodeType.BitNot, mc.Arguments[0], mc.Method, mc.SourceExpression)); case "op_False": return(this.sql.Unary(SqlNodeType.Not, mc.Arguments[0], mc.Method, mc.SourceExpression)); } return(mc); } if ((mc.Method.Name == "Equals") && (mc.Arguments.Count == 1)) { return(this.sql.Binary(SqlNodeType.EQ, mc.Object, mc.Arguments[0])); } if (!(mc.Method.Name == "GetType") || (mc.Arguments.Count != 0)) { return(mc); } MetaType sourceMetaType = TypeSource.GetSourceMetaType(mc.Object, this.model); if (sourceMetaType.HasInheritance) { Type type = sourceMetaType.Discriminator.Type; var discriminator = new SqlDiscriminatorOf(mc.Object, type, this.sql.TypeProvider.From(type), mc.SourceExpression); return(this.VisitExpression(this.sql.DiscriminatedType(discriminator, sourceMetaType))); } return(this.VisitExpression(this.sql.StaticType(sourceMetaType, mc.SourceExpression))); }