private StatementQueryBuildPart BuildWhereStatementRelations( IList <WhereStatementRelation> whereStatementRelations, int queryParamIndex, StatementRelationOperator relationOperator ) { var paramIndex = queryParamIndex; StatementQuery mergedQueryPart = null; foreach (var whereStatementRelation in whereStatementRelations) { var whereStatementsQueryPart = BuildWhereStatements(whereStatementRelation.WhereStatements, paramIndex, whereStatementRelation.RelationOperator); var relationStatementsQueryPart = BuildWhereStatementRelations(whereStatementRelation.WhereStatementRelations, whereStatementsQueryPart.QueryParamIndex, whereStatementRelation.RelationOperator); var itemMergedQueryPart = MergeQueryParts(whereStatementsQueryPart.StatementQueryPart, relationStatementsQueryPart.StatementQueryPart, whereStatementRelation.RelationOperator); paramIndex = relationStatementsQueryPart.QueryParamIndex; mergedQueryPart = MergeQueryParts(mergedQueryPart, itemMergedQueryPart, relationOperator); } return(new StatementQueryBuildPart { StatementQueryPart = mergedQueryPart, QueryParamIndex = paramIndex }); }
private StatementQuery MergeQueryParts( StatementQuery statementQueryPart, StatementQuery statementRelationsQueryPart, StatementRelationOperator statementRelationOperator ) { if (statementQueryPart == null && statementRelationsQueryPart == null) { throw new ArgumentException("Both statement query parts can not be null"); } if (statementQueryPart == null) { return(statementRelationsQueryPart); } if (statementRelationsQueryPart == null) { return(statementQueryPart); } var sql = $"({statementQueryPart.Sql}) {ResolveRelation(statementRelationOperator)} ({statementRelationsQueryPart.Sql})"; var parameters = statementQueryPart.Parameters.Concat(statementRelationsQueryPart.Parameters).ToList(); return(new StatementQuery(sql, parameters)); }