Hmm... Deixe-me adiantar que este artigo não tem muito significado prático, então os alunos que quiserem saber como usar algo podem pressionar Alt + F4 (ou Ctrl + W). Os alunos que desejam saber como o SharePoint funciona podem continuar rolando para baixo.
Atualmente estou escrevendo um livro sobre o desenvolvimento do SharePoint 2010 com KB e descobri acidentalmente esse método enquanto estudava o modelo de objeto recém-adicionado em 2010. Todos nós sabemos que em 2003/2007, o método GetItemById do SPList foi usado para obter itens de lista com base no ID (O quê, você não ouviu falar desse método? Receio que você não seja um desenvolvedor SharePoint qualificado...). O nome deste método recém-adicionado é GetItemByIdSelectedFields (um método GetItemByIdAllFields também é adicionado para acompanhá-lo, mas é completamente equivalente a GetItemById, então chega de bobagem. A definição do método é a seguinte:
1: public SPListItem GetItemByIdSelectedFields (int id, params string [] campos)
Quando vi isso pela primeira vez, pensei imediatamente na propriedade ViewFields do SPQuery. Ao obter uma entrada de lista, apenas alguns campos especificados são retornados para melhorar a eficiência. Mas quando escrevi um programa de console para testar, descobri que não era o que imaginei. Por exemplo, escrevi (este método requer escrever o nome interno):
1: SPListItem item = spList.GetItemByIdSelectedFields(1, "Título", "Criado");
Na verdade, este programa não relatou um erro e o valor Modificado foi retornado normalmente, então tentei. Na verdade, havia 50 campos em uma lista personalizada cujos valores foram retornados normalmente, mas todos os itens de consulta, usuários e grupos de usuários foram. retornado normalmente.(Na verdade, este é essencialmente um item de pesquisa) Nenhum foi retornado.
Movido pela curiosidade (isso ainda não pode me matar), o I Reflector olhou o código-fonte deste método:
1: if(field == null) 2: { 3: throw new ArgumentNullException("fields"); 5: 6: StringBuilder construtor = new StringBuilder(); 9: if (str != null) 10: { 11: builder.Append("<FieldRef Name="" + str + ""/>"); campo neste.Fields) 16: { 17: bool flag = false 18: foreach (string str2 nos campos) 19: { 20: if (str2 == field.InternalName) 21: { 22: flag = true 23: break; : construtor.Append(""/>"); 31: } 32: } 33: 34: retorne this.GetItemById(id, null, false, builder.ToString());
Em relação ao último GetItemById, não há necessidade de se aprofundar nele por enquanto. Apenas saiba que é uma sobrecarga de GetItemById, e seu objetivo é encontrar itens. O último parâmetro coloca os campos que precisam ser obtidos no formato CAML. .
O foreach na linha 7 é fácil de entender. Adicionamos os campos que precisamos, mas o foreach na linha 15 é um pouco confuso no início. E qual é o MustFetchByDefault do SPField? Vamos cavar um pouco mais fundo e dar uma olhada:
1: bool interno MustFetchByDefault 2: { 3: get 4: { 5: string fieldAttributeValue = this.GetFieldAttributeValue("List"); ToString())) 8: { 9: retornar falso; 10: } 11: retornar verdadeiro;
Como determinar se um campo precisa ser recuperado? Ao julgar um atributo List do campo, o método GetFieldAttributeValue não é mais postado (caso contrário, é suspeito de trapacear na contagem de palavras. Em suma, é encontrar uma List do nó Xml semelhante ao atributo SchemaXml (descrição do campo). ) das propriedades do Campo. Se for encontrado e não for GlobalList.Docs (alguma coisa especial), então este campo não é necessário. Ou seja, não preciso retornar este campo ao usuário.
Então, quais campos possuem atributos de lista no SchemaXml? Um campo com uma lista de atributos? Confira a matéria! Ha, realmente evitou todos os itens de pesquisa. (Docs é o atributo List do campo "path", que pode ter alguma origem especial)
Agora sabemos por que todos os outros campos estão incluídos e a pesquisa não. Mas por que? Se soubermos algo sobre o banco de dados de conteúdo do SharePoint, saberemos que o item de consulta na verdade armazena apenas um valor de ID na tabela AllUserData no banco de dados de conteúdo (mas quando é retirado usando o modelo de objeto, inclui o campo correspondente do conteúdo do item de consulta), o que significa que se você quiser retornar o valor do item de consulta, será necessário realizar algumas operações adicionais no banco de dados (como localizar o item que está sendo consultado, retornar o valor do campo correspondente e montá-lo em "1 ;#Administrador" esse tipo de aparência fantasma). Mais importante ainda, se o item de pesquisa tiver vários valores, o próprio item de pesquisa será armazenado em outra tabela (AllUserDataJunctions), portanto, será necessário muito esforço para devolvê-lo. Portanto, há uma novidade adicionada em 2010. Se nossa lista contiver muitos itens de pesquisa e pudermos usar apenas um ou dois deles (ou nenhum) por enquanto, parece que usar esse método pode realmente melhorar muito. eficiência.