Exemple #1
0
 internal override SqlExpression VisitDiscriminatorOf(SqlDiscriminatorOf dof)
 {
     return(new SqlDiscriminatorOf(this.VisitExpression(dof.Object), dof.ClrType, dof.SqlType, dof.SourceExpression));
 }
Exemple #2
0
 internal virtual SqlExpression VisitDiscriminatorOf(SqlDiscriminatorOf dof)
 {
     dof.Object = this.VisitExpression(dof.Object);
     return(dof);
 }
Exemple #3
0
            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)));
            }