public static IEnumerable <SelectStatement> GetSelectsUsingParameterInWhere(this IEnumerable <SelectStatement> selects, string parameter) { if (!selects.Any() || string.IsNullOrWhiteSpace(parameter)) { yield break; } foreach (var select in selects) { if (select.QueryExpression is QuerySpecification query) { if (query.FromClause == null || query.WhereClause == null) { continue; } var variableVisitor = new VariableReferenceVisitor(); query.WhereClause.Accept(variableVisitor); if (variableVisitor.Statements.Any(v => parameter.StringEquals(v.Name))) { yield return(select); } } } yield break; }
void ProcessBlock(BlockStatement node) { for (int i = 0; i < node.Statements.Count - 1; i++) { FixedStatement @fixed = null; List <VariableReference> variableReferences = new List <VariableReference>(); Statement statement = node.Statements[i]; @fixed = GetFixedStatement(statement, variableReferences); if (@fixed == null) { continue; } foreach (VariableReference variable in variableReferences) { methodContext.RemoveVariable(variable); } // remove the first statement. node.Statements.RemoveAt(i); // append the fixed block node.AddStatementAt(i, @fixed); ExpressionStatement expressionStmt = node.Statements[i + 1] as ExpressionStatement; int len = node.Statements.Count; VariableReference fixedVariable = null; VariableReferenceVisitor varibleVisitor = new VariableReferenceVisitor(); varibleVisitor.Visit(@fixed.Expression); fixedVariable = varibleVisitor.Variable; for (int stmtIndex = i + 1; stmtIndex < len; stmtIndex++) { varibleVisitor = new VariableReferenceVisitor(); varibleVisitor.Visit(node.Statements[stmtIndex]); VariableReference variable = varibleVisitor.Variable; if (variable != null && !variables.Contains(variable)) { variables.Add(variable); } if (node.Statements[stmtIndex].CodeNodeType == CodeNodeType.ExpressionStatement) { expressionStmt = node.Statements[stmtIndex] as ExpressionStatement; if (variable != null && variable == fixedVariable && expressionStmt.Expression.CodeNodeType == CodeNodeType.BinaryExpression && (expressionStmt.Expression as BinaryExpression).IsAssignmentExpression && (expressionStmt.Expression as BinaryExpression).Right.CodeNodeType == CodeNodeType.LiteralExpression && ((expressionStmt.Expression as BinaryExpression).Right as LiteralExpression).Value == null) { node.Statements.RemoveAt(stmtIndex); stmtIndex--; len--; break; } } @fixed.Body.AddStatement(node.Statements[stmtIndex]); node.Statements.RemoveAt(stmtIndex); stmtIndex--; len--; } ProcessBlock(@fixed.Body); break; } }
void ProcessBlock (BlockStatement node) { for (int i = 0; i < node.Statements.Count - 1; i++) { FixedStatement @fixed = null; List<VariableReference> variableReferences = new List<VariableReference>(); Statement statement = node.Statements[i]; @fixed = GetFixedStatement(statement, variableReferences); if (@fixed == null) { continue; } foreach (VariableReference variable in variableReferences) { methodContext.RemoveVariable(variable); } // remove the first statement. node.Statements.RemoveAt(i); // append the fixed block node.AddStatementAt(i, @fixed); ExpressionStatement expressionStmt = node.Statements[i + 1] as ExpressionStatement; int len = node.Statements.Count; VariableReference fixedVariable = null; VariableReferenceVisitor varibleVisitor = new VariableReferenceVisitor(); varibleVisitor.Visit(@fixed.Expression); fixedVariable = varibleVisitor.Variable; for (int stmtIndex = i + 1; stmtIndex < len; stmtIndex++) { varibleVisitor = new VariableReferenceVisitor(); varibleVisitor.Visit(node.Statements[stmtIndex]); VariableReference variable = varibleVisitor.Variable; if (variable != null && !variables.Contains(variable)) { variables.Add(variable); } if (node.Statements[stmtIndex].CodeNodeType == CodeNodeType.ExpressionStatement) { expressionStmt = node.Statements[stmtIndex] as ExpressionStatement; if (variable != null && variable == fixedVariable && expressionStmt.Expression.CodeNodeType == CodeNodeType.BinaryExpression && (expressionStmt.Expression as BinaryExpression).IsAssignmentExpression && (expressionStmt.Expression as BinaryExpression).Right.CodeNodeType == CodeNodeType.LiteralExpression && ((expressionStmt.Expression as BinaryExpression).Right as LiteralExpression).Value == null) { node.Statements.RemoveAt(stmtIndex); stmtIndex--; len--; break; } } @fixed.Body.AddStatement(node.Statements[stmtIndex]); node.Statements.RemoveAt(stmtIndex); stmtIndex--; len--; } ProcessBlock(@fixed.Body); break; } }