/// <summary> /// Remove a subquery from its parent and optionally any associated views /// </summary> /// <param name="sq"></param> /// <param name="removeResultsViews"></param> /// <param name="removeResultsPagesIfEmpty"></param> public static void RemoveSubQuery( Query sq, bool removeResultsViews, bool removeResultsPagesIfEmpty) { if (sq == null) { throw new Exception("Null subquery"); } Query pq = sq.Parent; if (pq == null || !pq.Subqueries.Contains(sq)) { throw new Exception("Subquery not contained in query"); } sq.Parent = null; pq.Subqueries.Remove(sq); // remove subquery from query if (!removeResultsViews) { return; } ResultsPages rPages = pq.ResultsPages; // overall results pages sq.ResultsPages = null; List <ResultsViewProps> rViews = sq.GetResultsViews(); if (rViews != null) // any views for subquery? { for (int vi = 0; vi < rViews.Count; vi++) { // remove any views from overall query ResultsPages ResultsViewProps rv = rViews[vi]; if (rv == null || rv.ResultsPage == null) { continue; } ResultsPage rp = rv.ResultsPage; if (rp == null || !rp.Views.Contains(rv)) { continue; } rp.Views.Remove(rv); if (removeResultsPagesIfEmpty && rp.Views.Count == 0 && // remove page if empty & requested rPages != null && rPages.Pages != null && rPages.Pages.Contains(rp)) { rPages.Remove(rp); } } } }