2013-05-08 26 views
6

Używam podejścia C# obiektu klienckiego po stronie klienta w celu pobrania wszystkich elementów listy z biblioteki dokumentów zawierającej podfoldery. Sprawdziłem dokumentację MSDN i utknąłem, dlaczego nie mogę uzyskać własności pola, lub jeśli nawet robię to dobrze.Odzyskiwanie wszystkich dokumentów ze wszystkich podfolderów w bibliotece dokumentów - CSOM

NetworkCredential credentials = System.Net.CredentialCache.DefaultNetworkCredentials; 
      ClientContext clientcontext = new ClientContext(Resources.defaultSPSite); 
      clientcontext.Credentials = credentials; 

      //Load Libraries from SharePoint 
      //Web site = clientcontext.Web; 
      clientcontext.Load(clientcontext.Web.Lists); 
      clientcontext.ExecuteQuery(); 


      //List sharedDocumentsList = clientcontext.Web.Lists.GetByTitle("TestLDOCS"); 
      //CamlQuery camlQuery = new CamlQuery(); 
      //camlQuery.ViewXml = @"<View Scope='Recursive'><Query></Query></View>"; 

      foreach (List list in clientcontext.Web.Lists) 
      { 
       clientcontext.Load(list); 
       clientcontext.ExecuteQuery(); 
       //list.TemplateFeatureId.ToString().Equals("") && 
        string baseType = list.BaseType.ToString(); 
        string listTitle = list.Title.ToString(); 
        if (list.BaseType.ToString().Equals("DocumentLibrary", StringComparison.InvariantCultureIgnoreCase) && list.Title.ToString().Equals("TestLDOCS", StringComparison.InvariantCultureIgnoreCase)) 
        { 
         foreach (Folder subFolder in list.RootFolder.Folders) 
         { 
          foreach (File f in subFolder.Files) 
          { 
           Console.WriteLine((string) f.Title);      
          } 
         } 
        } 
      } 
     } 

Błąd, że otrzymuję to, że „foreach (f pliku w subFolder.Files)” zbiór nie może być inicjowany błąd. Czy mimo to uzyskuje się wartości pól wszystkich dokumentów w każdym podfolderze w bibliotece dokumentów za pomocą CSOM?

Wiem, że można również mocno wpisać wartości pól z pozycją listy, np. (ListItem ["fieldName"]). Czy powinienem zamiast tego iść tą trasą?

Odpowiedz

7

Niektóre zalecenia:

1) woli ClientRuntimeContext.LoadQuery method aby załadować określony list, na przykład:

var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary)); 
ctx.ExecuteQuery(); 

2) Ponieważ SharePoint SCOM obsługuje Request Batching zaleca się, aby zminimalizować liczbę żądań do serwera. Poniższy przykład pokazuje, jak wykonać pojedynczy żądanie do serwera w celu załadowania wszystkich plików z bibliotek dokumentów:

foreach (var list in lists) 
{ 
    var items = list.GetItems(CreateAllFilesQuery()); 
    ctx.Load(items, icol => icol.Include(i => i.File)); 
    results[list.Title] = items.Select(i=>i.File); 
} 
ctx.ExecuteQuery(); 

3) Wolę, aby załadować wszystkie pliki za pośrednictwem zapytania Caml jak pokazano poniżej:

public static CamlQuery CreateAllFilesQuery() 
{ 
    var qry = new CamlQuery(); 
    qry.ViewXml ="<View Scope=\"RecursiveAll\"><Query><Where><Eq><FieldRef Name=\"FSObjType\" /><Value Type=\"Integer\">0</Value></Eq></Where></Query></View>"; 
    return qry; 
} 

Następnie Poniższy przykład zwróci wszystkie pliki znajdujące się w bibliotece:

var items = list.GetItems(CreateAllFilesQuery()); 
ctx.Load(items, icol => icol.Include(i => i.File)); 
ctx.ExecuteQuery(); 
var files = items.Select(i=>i.File).ToList(); 

jest bardziej zoptymalizowany sposób LO ading szczegółowych wykazów z punktu widzenia wydajności

Kompletny przykład

Jak załadować wszystkie pliki z bibliotek dokumentów za pomocą programu SharePoint CSOM:

using (var ctx = new ClientContext(webUri)) 
{ 

    var results = new Dictionary<string, IEnumerable<File>>(); 
    var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary)); 
    ctx.ExecuteQuery(); 
    foreach (var list in lists) 
    { 
     var items = list.GetItems(CreateAllFilesQuery()); 
     ctx.Load(items, icol => icol.Include(i => i.File)); 
     results[list.Title] = items.Select(i=>i.File); 
    } 
    ctx.ExecuteQuery(); 

    //Print results 
    foreach (var result in results) 
    { 
     Console.WriteLine("List: {0}",result.Key); 
     foreach (var file in result.Value) 
     { 
      Console.WriteLine("File: {0}", file.Name); 
     } 
     }   
} 
+0

Twoje podejście wydaje się naprawdę dobre, ale dostaję NotSupportedException na 'items.Select (i => i.File) ' – Santhos

1
foreach (List list in clientcontext.Web.Lists) 
     { 
      clientcontext.Load(list); 
      clientcontext.ExecuteQuery(); 
      //list.TemplateFeatureId.ToString().Equals("") && 
       string baseType = list.BaseType.ToString(); 
       string listTitle = list.Title.ToString(); 
       if (list.BaseType.ToString().Equals("DocumentLibrary", StringComparison.InvariantCultureIgnoreCase) && list.Title.ToString().Equals("TestLDOCS", StringComparison.InvariantCultureIgnoreCase)) 
       { 
        foreach (Folder subFolder in list.RootFolder.Folders) 
        { 
      clientcontext.Load(subFolder.Files); 
        clientcontext.ExecuteQuery(); 
         foreach (File f in subFolder.Files) 
         { 
          Console.WriteLine((string) f.Title);      
         } 
        } 
       } 
     } 
    } 
+0

Brakuje dodatkowych obciążeń dla zapytania „i” list.RootFolder następnie "list.RootFolder.Folders". Jeśli ich nie dodasz, to nie zadziała (daj błąd inicjalizacji, ale +1 za zbliżanie mnie. :) –