无法从共享点列表加载计算字段
本文关键字:加载 计算 字段 列表 共享 | 更新日期: 2023-09-27 18:00:08
我是SharePoint的新手。我需要使用ClientContext
从SP列表中加载一些字段值。我使用sharepoint客户端对象模型。
这是我的代码:
...
//Web spWeb
//CamlQuery camlQuery
List spList = spWeb.Lists.GetById(parameters.Config.List.ID);
ListItemCollection itemsCollection = spList.GetItems(camlQuery);
ClientContext.Load(itemsCollection, items => items.ListItemCollectionPosition);
ClientContext.Load(itemsCollection, items => items.Include(item => item.HasUniqueRoleAssignments, item => item.EffectiveBasePermissions, item => item.Id, item => item.FileSystemObjectType));
foreach (Dk14PhysicalField field in parameters.FieldsToReturn)//all required fields come here
{
ClientContext.Load(itemsCollection, items => items.Include(item => item[field.PhysicalName]));
}
try
{
ClientContext.ExecuteQuery();
}
catch (Exception ex)
{
//get exception here: Field or property "LinkTitle" does not exist.
}
CamlQuery xml所在位置:
<View Scope="RecursiveAll">
<ViewFields>
<FieldRef Name="LinkTitle"/>
<FieldRef Name="Summary_x0020_Business_x0020_Des"/>
<FieldRef Name="City"/>
<FieldRef Name="Title"/>
<FieldRef Name="LinkTitleNoMenu"/>
<FieldRef Name="Modified"/>
<FieldRef Name="Author"/>
</ViewFields>
<RowLimit>2147483647</RowLimit>
<Query>
<OrderBy Override="TRUE">
<FieldRef Name="ID"/>
</OrderBy>
<Where>
<Or>...some conditions here...</Or>
</Where>
</Query>
</View>
在尝试加载计算字段LinkTitle
或LinkTitleNoMenu
之前,此代码运行良好在这种情况下,我在ExecuteQuery
上得到异常:"Field or property "LinkTitle" does not exist.
"
理论上我可以得到这些计算的场。要做到这一点,我不需要加载ListItemCollectionPosition
,而只需要将计算字段包括在ClientContext
中。如果我不做这些技巧中的一个,执行将失败,并出现不同的错误。
你有什么想法吗?
当您添加ListItemCollectionPosition字段时
ClientContext.Load(itemsCollection,items=>items.ListItemCollectionPosition);
它会在请求中自动设置SelectAllProperties=true的值,然后阻止Computed列返回。
然后,您会收到消息"字段或属性"XYZ"不存在"
这只发生在CSOM客户端组件的较新版本上,即架构版本15.0.0.0和库版本16.0.0.0
经过多次尝试和错误,我发现通过在单个调用中添加此参数作为第二个参数,不会发生这种情况。
例如,以这种方式请求ID和ListItemCollectionPosition不会将SelectAllProperties设置为true。
ClientContext.Load(listitems,items=>items.Include(item=>item["ID"]),l=>l.ListItemCollectionPosition);
我认为这是库中的一个Bug,但这似乎可以绕过它。
它取决于List对象的类型。
例如,对于Generic Lists
,可以检索LinkTitle和LinkTitleNoMenu字段,如下所示:
//Specify fields to retrieve via ClientContext.Load
var list = context.Web.Lists.GetByTitle(listTitle);
var qry = CamlQuery.CreateAllItemsQuery();
var items = list.GetItems(qry);
context.Load(items, icol => icol.Include(i => i["LinkTitle"], i => i["LinkTitleNoMenu"]));
或
//Specify fields to retrieve via ViewFields
var list = context.Web.Lists.GetByTitle(listTitle);
var qry = CamlQuery.CreateAllItemsQuery(100, new[] { "LinkTitle", "LinkTitleNoMenu" }); var items = list.GetItems(qry);
context.Load(items);
对于Document Library
,应该指定LinkFilename和LinkFilenameNoMenu字段:
//Specify fields to retrieve via ViewFields
var list = context.Web.Lists.GetByTitle(listTitle);
var qry = CamlQuery.CreateAllItemsQuery(100, new[] { "LinkFilename", "LinkFilenameNoMenu" }); var items = list.GetItems(qry);
context.Load(items);