/// <summary> /// Builds the current set of Clauses and returns the full statement as a string. /// </summary> /// <param name="parameters">A list that will be filled with the statements parameters</param> /// <returns></returns> public string BuildStatement(List <SQLiteParameter> parameters) { StringBuilder builder = new StringBuilder(); int paramsCounter = parameters?.Count ?? 0; int counter = 0; // Remove empty expressions Clauses.RemoveAll(x => x.Expressions.Count == 0); // Loop through each Where clause (wrapped in parenthesis) foreach (var clause in Clauses) { // Open Parent Clause grouping if we have more then 1 SubClause int subCounter = 0; builder.AppendIf(clause.Expressions.Count > 1 && Clauses.Count > 0, '('); // Append each Sub Clause foreach (var expression in clause.Expressions) { // If we have more sub clauses in this group, append operator builder.AppendIf(++subCounter > 1, (InnerClauseOperator == LogicOperator.Or) ? " OR " : " AND "); builder.Append((parameters == null) ? expression.ToString() : expression.BuildExpression(parameters)); } // Close Parent Clause grouping builder.AppendIf(clause.Expressions.Count > 1 && Clauses.Count > 0, ')'); // If we have more clauses, append operator builder.AppendIf(++counter < Clauses.Count, (InnerClauseOperator == LogicOperator.And) ? " OR " : " AND "); } return(builder.ToString()); }