为何使用CSOM通过CamlQuery获取SharePoint ListItem时无法访问Editor字段?
在C#使用SharePoint客户端对象模型(CSOM)时,遇到以下问题:尝试访问列表项的Modified By(内部字段名Editor)字段时,提示属性或字段未初始化;调试发现该字段不在ListItem的字段集合中。但直接通过ID获取同一列表项时,却能正常访问Editor字段。
场景设置
string siteUrl = @"https://sharepointsite"; ClientContext context = new ClientContext(siteUrl); List qsList = context.Web.Lists.GetByTitle("SharePointList"); context.ExecuteQuery(); User theUser = context.Web.EnsureUser("SharePointUser"); context.ExecuteQuery();
可行方案:通过ID获取列表项
此方法能正常访问Editor字段,调试时可在本地窗口看到对应的键值对:
ListItem item = qsList.GetItemById(1); context.Load(item); context.ExecuteQuery(); FieldUserValue editor = (FieldUserValue)item?["Editor"]; Console.WriteLine(editor.LookupValue);
问题场景:通过CamlQuery获取ListItemCollection
使用CamlQuery获取列表项集合时,同一ID的ListItem中不存在Editor键值对,访问时会报错:
CamlQuery query = CamlQuery.CreateAllItemsQuery(10); ListItemCollection qsItems = qsList.GetItems(query); context.Load(qsItems); context.ExecuteQuery(); foreach (ListItem listItem in qsItems) { Console.WriteLine(listItem); FieldUserValue editor = (FieldUserValue)listItem?["Editor"]; Console.WriteLine(editor.LookupValue); }
问题原因与解决方法
原因
CSOM中,调用context.Load(qsItems)获取列表项集合时,默认仅加载列表项的核心基础字段,不会自动包含用户类型的字段(如Editor)。而通过GetItemById获取单个项时,context.Load(item)默认会加载更多字段,包括用户字段,因此能正常访问。
解决方法
修改context.Load调用,显式指定需要加载的Editor字段,示例如下:
CamlQuery query = CamlQuery.CreateAllItemsQuery(10); ListItemCollection qsItems = qsList.GetItems(query); // 显式包含Editor字段 context.Load(qsItems, items => items.Include(item => item["Editor"])); context.ExecuteQuery(); foreach (ListItem listItem in qsItems) { Console.WriteLine(listItem); FieldUserValue editor = (FieldUserValue)listItem?["Editor"]; Console.WriteLine(editor.LookupValue); }
也可以使用IncludeWithDefaultProperties来保留默认字段并添加需要的字段:
context.Load(qsItems, items => items.IncludeWithDefaultProperties(item => item["Editor"]));
这样修改后,Editor字段会被从服务器拉取到本地,即可正常访问。
内容的提问来源于stack exchange,提问作者Brendan Mahoney
相关产品推荐
相关产品推荐

