I had a need to show the path of terms, starting from a specific term and then showing the path to the final children.
This would involve traversing the structure as the depth is unknown, so I wrote this piece of code to accomplish this using the Client Components.
Please feel free to steal and improve (Only if you give back the improved code though!)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
| private IEnumerable<Path> Paths(bool includeRoot, Guid termId, string siteUrl) { var paths = new List<Path>();
Action<ClientContext, Term, String> traverse = null;
traverse = (context, term, path) => { context.Load(term, t => t.Id, t => t.Name, t => t.Terms); context.ExecuteQuery();
if(!(term.Id == termId && !includeRoot)) path += path == string.Empty ? term.Name : " > {0}".ToFormat(term.Name);
if (term.Terms.Count == 0) { paths.Add(new Path { TermId = term.Id, PathText = path }); } else { foreach(var st in term.Terms) { traverse(context, st, path); } } };
using(var context = new ClientContext(siteUrl)) { var rootTerm = TaxonomySession.GetTaxonomySession(context).GetTerm(termId);
traverse(context, rootTerm, string.Empty); }
return paths; }
public class Path { public Guid TermId { get; set; }
public string PathText { get; set; } }
|