Oi pessoal,
Essa semana realizei a migração de Lookup Lists e Lookup fields. Fiquei impressionado pela falta de documentação e exemplos de como trabalhar com Taxonomy field values.
Nessa nota rápida vou mostrar a vocês um exemplo de como se trabalhar com o novo modelo de objetos para a migração de field values (Lookup fields X Taxonomy fields).
Premissa
Considere a seguinte Lookup List e Term Store nesse exemplo, que contém os jogadores da seleção da Copa de 2010, conforme Figura 1:
Figura 1 – Lookup List vs Taxonomy Term Store
OBS: Como você pode perceber, a decisão em migrar Lookup fields para Taxonomy fields é uma batalha. Será que vale a pena? No meu caso como estou criando um Content Type Hub, todos os Site Columns não podem possuir dependencias, então uma solução é se livrar dos Lookup fields.
Lookup fields X Taxonomy fields
Imagine uma Lista que contenha ambos os campos (fields), o primeiro mapeia a Lookup List e o segundo o Term Store. Nesse cenário o Lookup field contém valores, porém o Taxonomy field não, pois foi recentemente criado e precisa ser populado.
Como uma solução para isso, o código abaixo mapeia os Lookup field values para Taxonomy field values, também conhecido como Managed Metadata field values.
Code Snippet
- static void Main(string[] args)
- {
- var url = ConfigurationManager.AppSettings["Url"].ToString();
- var library = ConfigurationManager.AppSettings["Library"].ToString();
-
- // Leitura de XML, considere
- // (key => lookup field,value => taxonomy field)
- Dictionary<string, string> mappingFields = XMLHelper.ReadDictionaryXML("MappingFields.xml");
-
- using (SPSite site = new SPSite(url))
- {
- using (SPWeb web = site.RootWeb)
- {
- // Obtem a lista/library
- SPList list = web.Lists[library];
-
- foreach (SPListItem item in list.Items)
- {
- // Itera em todos os mapped fields
- foreach (var mappedField in mappingFields)
- {
- if (item.Fields.ContainsField(mappedField.Key))
- {
- // Atualiza sem deixar rastros
- web.Site.AllowUnsafeUpdates = true;
-
- // Obtem a instancia do lookup field
- var lookupValueList = (item[mappedField.Key] as SPFieldLookupValueCollection).ToList();
-
- // Obtem a instancia do taxonomy field
- TaxonomyField managedField = item[mappedField.Value] as TaxonomyField;
-
- // Obtem a taxonomy session atual
- TaxonomySession session = new TaxonomySession(web.Site, false);
-
- // Obtem o term store (pelo SspId)
- var termStoreCol = session.TermStores[managedField.SspId];
-
- // Obtem os termos de um especifico term set (pelo TermSetId)
- var termCol = termStoreCol.GetTermSet(managedField.TermSetId).Terms;
-
- var listTerms = new List<Term>();
-
- // Itera em todos os lookup values
- foreach (var itemValue in lookupValueList)
- {
- string value = itemValue.LookupValue;
-
- // Obtem o termo que corresponde a cada valor
- // encontrado na lista de lookup values
- var termToSet = termCol[value];
-
- listTerms.Add(termToSet);
- }
-
- // Define o field value utilisando a lista de termos
- managedField.SetFieldValue(item, listTerms);
-
- // Salva o item
- item.SystemUpdate();
-
- // Cancela unsafe updates
- web.Site.AllowUnsafeUpdates = false;
- }
- }
- }
- }
- }
- }
OBS: O código acima está bem comentado, o que dispensa comentários.
Espero que essa nota rápida ajude.
Referência:
http://msdn.microsoft.com/en-us/library/microsoft.sharepoint.taxonomy.taxonomyfield.aspx
[]’s,
Marcel Medina
Clique aqui para ler o mesmo conteúdo em Inglês.