public static WhereStatement Copy(WhereStatement statement) { var result = new WhereStatement(); var currentLevel = 0; // ReSharper disable once UnusedVariable foreach (var level in statement) { currentLevel++; result.Add(new List <WhereClause>()); foreach (var clause in statement[currentLevel - 1]) { var clauseCopy = new WhereClause(clause.FieldName, clause.ComparisonOperator, clause.Value); foreach (var subClause in clause.SubClauses) { var subClauseCopy = new WhereClause.SubClause(subClause.LogicOperator, subClause.ComparisonOperator, subClause.Value); clauseCopy.SubClauses.Add(subClauseCopy); } result[currentLevel - 1].Add(clauseCopy); } } return(result); }
/// <summary> /// This static method combines 2 where statements with eachother to form a new statement /// </summary> /// <param name="statement1"></param> /// <param name="statement2"></param> /// <returns></returns> public static WhereStatement CombineStatements(WhereStatement statement1, WhereStatement statement2) { // statement1: {Level1}((Age<15 OR Age>=20) AND (strEmail LIKE 'e%') OR {Level2}(Age BETWEEN 15 AND 20)) // Statement2: {Level1}((Name = 'Peter')) // Return statement: {Level1}((Age<15 or Age>=20) AND (strEmail like 'e%') AND (Name = 'Peter')) // Make a copy of statement1 var result = Copy(statement1); // Add all clauses of statement2 to result for (var i = 0; i < statement2.ClauseLevels; i++) // for each clause level in statement2 { var level = statement2[i]; foreach (var clause in level) // for each clause in level i { for (var j = 0; j < result.ClauseLevels; j++) // for each level in result, add the clause { result.AddWhereClauseToLevel(clause, j); } } } return(result); }