Как получить все дочерние термины термина SharePoint в C #? - PullRequest
7 голосов
/ 10 марта 2011

Я пишу веб-часть для SharePoint 2010, которая восстанавливает последнюю страницу определенного (пользовательского) типа в соответствии с датой публикации. Он учитывает только страницы, помеченные указанным термином. Мне бы хотелось, чтобы это можно было также делать со страницами, которые помечены терминами, которые являются потомками выбранных терминов.

Если у меня есть дерево терминов, например:

  • Англия
    • Kent
      • Dover
      • Canterbury
    • Surrey
      • Кройдон
      • 1020 * Кролей *

затем, выбрав Кент, я хочу, чтобы моя веб-часть показывала последнюю страницу с тегами Кент, Дувр или Кентербери.

Возможно ли это в C #?

Спасибо за ваше время.

Ответы [ 2 ]

5 голосов
/ 11 марта 2011

Функция, которую вы ищете: Term.GetTerms

Вам нужно будет получить TaxonomyValue с вашего поля

Затем вы должны получить текущий TaxonomySession, затем использовать TaxonomySession, чтобы получить термин, используемый в поле. Из этого термина вы можете использовать родительское поле, чтобы получить родительский термин. Вот примерный код, показывающий используемые объекты.

         TaxonomyFieldValue v = null; // Notsurehowtodothisbit();
        TaxonomySession session = new TaxonomySession(site);
        if (session.TermStores != null && session.TermStores.Count > 0)
        {

            TermStore termStore = session.TermStores[0];
            Term t = termStore.GetTerm(v.TermGuid);
            Term parentTerm = t.Parent;   
            TermCollection childTerms = t.GetTerms();
        }

Если у вас есть дерево, вы можете использовать запрос caml для генерации запроса SPList.GetList, который возвращает все помеченные таким образом.

Я не провел эксперимент в этом отношении ... Но Барт-Ян Хоймейкерс имеет

    private SPListItemCollection GetItemsByTerm(Term term, SPList list)
    {
        // init some vars    SPListItemCollection items = null;    
        SPSite site = SPContext.Current.Site;     // set up the TaxonomySession    
        TaxonomySession session = new TaxonomySession(site);
        // get the default termstore    TermStore termStore = session.TermStores[0];   
        // If no wssid is found, the term is not used yet in the sitecollection, so no items exist using the term   
        int[] wssIds = TaxonomyField.GetWssIdsOfTerm(SPContext.Current.Site, termStore.Id, term.TermSet.Id, term.Id, false, 1);
        if (wssIds.Length > 0)
        {
            // a TaxonomyField is a lookupfield. Constructing the SPQuery       
            SPQuery query = new SPQuery();
            query.Query = String.Format("<Where><Eq><FieldRef Name='MyTaxonomyField' LookupId='TRUE' /><Value Type='Lookup'>{0}</Value></Eq></Where>", wssIds[0]);
            items = list.GetItems(query);
        }
        return items;
    }
2 голосов
/ 11 марта 2011

Частичный ответ Ната с использованием метода GetTerms для родителя великолепен. Код для запроса одного списка тоже выглядит хорошо.

Чтобы получить идентификатор для родительского термина, вы можете использовать TermStore.GetTerms для заголовка.

Для поиска по всем спискам и библиотекам в семействе сайтов можно использовать метод FullTextSQLQuery API-интерфейса поиска, указав указатели в предложении where с столбцом owstaxIdMyTaxonomyField в качестве столбца.

Существует прекрасный пример получения идентификаторов по названию и поиска хранилища терминов по идентификатору в Использование полей таксономии в SharePoint 2010: часть III

...