2013-05-08 2 views
6

Я использую подход C# для объектной модели на стороне клиента, чтобы получить все элементы списка из библиотеки документов, содержащей подпапки. Я проверил документацию MSDN, и я зациклился на том, почему я не могу получить свойство поля, или если я даже делаю это правильно.Извлечь все документы из всех подпапок в библиотеке документов - 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);      
          } 
         } 
        } 
      } 
     } 

ошибка, что я получаю то, что «Еогеасп (File е в subFolder.Files)» сбор не может быть инициализирован ошибка. В любом случае, чтобы получить значения полей всех документов в каждой подпапке в библиотеке документов с использованием CSOM?

Я знаю, что вы можете строго ввести значения полей также с элементом списка ie (listItem ["fieldName"]). Должен ли я идти по этому маршруту?

ответ

7

Некоторые рекомендации:

1) Предпочитают ClientRuntimeContext.LoadQuery method загрузить конкретные списки, например:

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

2) Поскольку SharePoint SCOM поддерживает Request Batching рекомендуется минимизировать число запросов к серверу. Следующий пример демонстрирует, как выполнить одного запроса на сервер для того, чтобы загрузить все файлы из библиотеки документов:

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) Предпочитает, чтобы загрузить все файлы через CAML запрос, как показано ниже:

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; 
} 

Тогда следующий пример возвратит все файлы в библиотеке:

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

Это более оптимизированный способ Ио ADING конкретные списки с точки зрения производительности

Полный пример

Как загрузить все файлы из библиотеки документов с помощью 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

Ваш подход кажется действительно хорошим, но я получаю NotSupportedException на '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

Вы пропускаете дополнительные нагрузки запросов для «list.RootFolder» и затем «list.RootFolder.Folders». Если вы не добавите их, это не сработает (дайте ошибку инициализации, но +1 для получения меня ближе. :) –