예제 #1
0
        public void Test_Select()
        {
            var sql        = @"SELECT Customer.firstname, Customer.lastname, Address.Country, City 
                        FROM Customer 
                        INNER JOIN Address ON Address.CustNo = Customer.CustNo";
            var visitor    = parser.ParseScript(sql);
            var selectNode = visitor.SelectNodes.First();

            var tableVisitor = new TableVisitor();

            selectNode.Accept(tableVisitor);
            var tables = tableVisitor.SelectNodes;

            Console.WriteLine(
                "{0}: {1}",
                "Tables",
                String.Join(",", tables.Select(x => x.SchemaObject.BaseIdentifier.Value))
                );

            var columnsVisitor = new ColumnVisitor();

            selectNode.Accept(columnsVisitor);
            var columns = columnsVisitor.SelectNodes;

            Console.WriteLine(
                "{0}: {1}",
                "Columns",
                String.Join(",", columns.Select(x => x))
                );
        }
예제 #2
0
            protected override Expression VisitMethodCall(MethodCallExpression m)
            {
                if (m.Method.DeclaringType == typeof(Queryable))
                {
                    if (m.Method.Name == "Where")
                    {
                        sb.Append("SELECT * FROM (");
                        this.Visit(m.Arguments[0]);
                        sb.Append(") AS T WHERE ");
                        LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
                        this.Visit(lambda.Body);
                        return(m);
                    }
                    else if (m.Method.Name == "FirstOrDefault")
                    {
                        sb.Append("SELECT * FROM (");
                        this.Visit(m.Arguments[0]);
                        sb.Append(") AS T WHERE ");
                        LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);
                        this.Visit(lambda.Body);
                        return(m);
                    }
                    else if (m.Method.Name == "Select")
                    {
                        LambdaExpression lambda = (LambdaExpression)StripQuotes(m.Arguments[1]);

                        ColumnProjection projection = new ColumnVisitor().ProjectColumns(lambda.Body, this.row);

                        sb.Append("SELECT ");

                        sb.Append(projection.Columns);

                        sb.Append(" FROM (");

                        this.Visit(m.Arguments[0]);

                        sb.Append(") AS T ");

                        this.projection = projection;

                        return(m);
                    }
                }
                throw new NotSupportedException(string.Format("The method '{0}' is not supported", m.Method.Name));
            }