我使用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)。
有什么想法可以让我加载该属性吗?
谢谢。
答案 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);
}