Some recommendations:
1) Prefer the ClientRuntimeContext.LoadQuery method for loading specific lists, for example:
var lists = ctx.LoadQuery(ctx.Web.Lists.Where(l => l.BaseType == BaseType.DocumentLibrary)); ctx.ExecuteQuery();
2) Since SharePoint SCOM supports Request Batching , it is recommended that you minimize the number of requests to the server. The following example shows how to execute a single request to a server to download all files from document libraries:
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) Prefer to download all files using a CAML request, as shown below:
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; }
Then, in the following example, all files in the library will be returned:
var items = list.GetItems(CreateAllFilesQuery()); ctx.Load(items, icol => icol.Include(i => i.File)); ctx.ExecuteQuery(); var files = items.Select( i=>i.File).ToList();
This is a more streamlined way to load specific lists from a performance perspective.
Full example
How to download all files from document libraries using 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();
source share