#c# #sharepoint #csom
#c# #sharepoint #csom
Вопрос:
итак, я пытаюсь реализовать функцию для получения всех файлов из дерева SharePoint. Функция работает нормально, за исключением времени ее загрузки.
Вот что я сделал
private List<ListItem> GetAllItems(ClientContext Context, List list, List<ListItem> ListItems, CamlQuery camlQuery)
{
camlQuery.ViewXml =
@"< View Scope = 'RecursiveAll'>
< Query >
<Where>
</Where>
</ Query >
</ View >";
ListItemCollection AllItems = list.GetItems(camlQuery);
Context.Load(AllItems);
Context.ExecuteQuery();
foreach (ListItem item in AllItems)
{
if (item.FileSystemObjectType == FileSystemObjectType.File)
{
if (!ListItems.Contains(item))
ListItems.Add(item);
}
if (item.FileSystemObjectType == FileSystemObjectType.Folder)
{
camlQuery.FolderServerRelativeUrl = item.FieldValues["FileRef"].ToString();
GetAllItems(Context, list, ListItems, camlQuery);
}
}
return ListItems;
}
Проблема Context.ExecuteQuery();
в том, что загрузка каждого запроса занимает у меня от 0,3 до 1 секунды, а для дерева, в котором у меня 1424 папки, загрузка заняла более 4 минут, и это было бы слишком долго, если бы количество папок увеличилось.
Итак, я хочу спросить, есть ли какая-либо возможность сократить время загрузки этого или в любом случае более оптимально получать все файлы из дерева SharePoint?
Ответ №1:
Это статья об оптимизации кода CSOM для справки: https://www.codeproject.com/Articles/738008/Programming-Efficiently-with-the-SharePoint-Client
Основная идея:
- Запрашивайте только то, что вы хотите (но запрашивайте все, что хотите, за один раз!)
- Вызывайте ExecuteQuery экономно
- Дополнительно: параллельный и асинхронный код
- Кэширование данных в сеансе