c# - 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)。
有什么想法可以加载该属性吗?
谢谢你。
解决方案
这里至少可以考虑两个选项:
选项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);
}
推荐阅读
- php - 防止 wordpress 标题中的换行和样式文本
- php - 不会从 elementor 表单中提取表单输入
- javascript - 使用 djs v13 播放本地音乐文件
- image - 在flatList中通过模态打开动态图像反应本机
- vue.js - Sass @use 不会在 Vue 组件中导入
- java - 是否可以将 QueryCursor 存储在 Firestore 上?
- python - 使用 subprocess.call() 调用 C 程序时的奇怪行为
- javascript - 如何在反应三纤维 MapControls 中限制平移距离
- docker - 使用 docker push 到私有注册表(Heroku Registry)时出现 401 错误
- vb.net - 删除按钮未执行其预期功能,即删除 vb.net 中的记录