SharePoint CSOM:从GetChanges()加载FileSystemObjectType属性

时间:2018-08-30 09:12:22

标签: c# sharepoint csom

我使用Web.GetChanges()从SharePoint网站检索许多更改。

我需要遍历所有更改,对于作为ChangeItem的每个更改,请检查 FileSystemObjectType 属性(以区分对项目的更改和对文件夹的更改)。

我找不到加载该属性的方法:

当我调用GetChanges()时无法加载它,因为FileSystemObjectType是ChangeItem的属性,而不是Change的属性(从GetChanges返回);

一旦将Change转换为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 Web)。

有什么想法可以让我加载该属性吗?

谢谢。

1 个答案:

答案 0 :(得分:0)

这里至少可以考虑两个选项:

选项1

明确指定仅通过Microsoft.SharePoint.Client.ChangeQuery加载 ChangeItem

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