SharePoint CSOM: загрузить свойство FileSystemObjectType из GetChanges () - PullRequest
0 голосов
/ 30 августа 2018

Я использую Web.GetChanges (), чтобы получить ряд изменений из сети SharePoint.

Мне нужно просмотреть все изменения и, для каждого изменения, являющегося ChangeItem, проверить свойство FileSystemObjectType (чтобы различать изменения в элементах и ​​изменения в папках).

Я не могу найти способ загрузить это свойство:

Я не могу загрузить его при вызове GetChanges (), поскольку FileSystemObjectType является свойством ChangeItem, а не Change (возвращается из GetChanges);

Я не могу использовать его после того, как произнесу Change to ChangeItem, потому что он возвращает исключение «Свойство не инициализировано».

Это часть кода, о которой идет речь:

ChangeCollection changes = spcn.RootWeb.NativeWeb.GetChanges(query);

/* I cannot include FileSystemObjectType here */
spcn.RootWeb.NativeWeb.Context.Load(changes); //, c => c.Include(o => o.FileSystemObjectType));
spcn.RootWeb.NativeWeb.Context.ExecuteQuery();

foreach (Change change in changes)
{
    Console.Write($"{change.GetType().Name} {change.ChangeType} {change.Time} "); 

    if (change is ChangeItem)
    {
        ChangeItem ci = (ChangeItem)change;

        /* FileSystemObjectType is *not* initalised here */ 
        Console.WriteLine($"{ci.ItemId} {ci.FileSystemObjectType}");
    }

Надеюсь, это достаточно ясно, дайте мне знать, если это не так (NativeWeb - это сеть SharePoint).

Есть идеи, как мне загрузить это свойство?

Спасибо.

1 Ответ

0 голосов
/ 03 сентября 2018

Здесь можно рассмотреть как минимум два варианта:

Вариант 1

явно указать для загрузки только ChangeItem через Microsoft.SharePoint.Client.ChangeQuery:

var changeQuery = new ChangeQuery(false,true);
changeQuery.Item = true; //only load change item changes

и затем запрос на загрузку ChangeItem определенных свойств, таких как:

  ctx.Load(changes, cc => cc.Include(c => ((ChangeItem)c).FileSystemObjectType));

Пример

var changeQuery = new ChangeQuery(false,true);
changeQuery.Item = true; //only load change item changes
var changes = ctx.Web.GetChanges(changeQuery);
ctx.Load(changes, cc => cc.Include(c => c.ChangeType, c => ((ChangeItem)c).FileSystemObjectType));
ctx.ExecuteQuery();

foreach(var change in changes)
{
     ChangeItem changeItem = change as ChangeItem;
     Console.WriteLine("{0}: {1}",changeItem.ChangeType,changeItem.FileSystemObjectType);
}

Вариант 2

Допустим, вы предварительно загружаете все изменения следующим образом:

var changeQuery = new ChangeQuery(true,true);
var changes = ctx.Web.GetChanges(changeQuery);
ctx.Load(changes);
ctx.ExecuteQuery();

Затем можно запросить определенные свойства объекта ChangeItem с дополнительным запросом, подобным следующему:

var changeItems = changes.OfType<ChangeItem>();
var changeItemsResult = ctx.LoadQuery(changeItems.Include(c =>c.ChangeType, c => c.FileSystemObjectType));
ctx.ExecuteQuery();

foreach (var changeItem in changeItemsResult)
{
     Console.WriteLine("{0}: {1}",changeItem.ChangeType,changeItem.FileSystemObjectType);
}
...