首页 > 解决方案 > SharePoint CSOM:从 GetChanges() 加载 FileSystemObjectType 属性

问题描述

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

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

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

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

一旦我将 Change 转换为 ChangeItem,我就无法使用它,因为它返回“Property no initialised”异常。

这是有问题的代码:

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)。

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

谢谢你。

标签: c#sharepointcsom

解决方案


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

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

推荐阅读