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)) ); }
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)); }