无法从sharepoint列表加载计算字段

时间:2014-04-25 06:41:27

标签: c# sharepoint sharepoint-2010

我是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>

此代码正常工作,直到我尝试加载计算字段LinkTitleLinkTitleNoMenu 在这种情况下,我在ExecuteQuery上获得例外:&#39; Field or property "LinkTitle" does not exist.&#39;

理论上我可以得到这些计算字段。为此,我不需要加载ListItemCollectionPosition并仅将计算字段包含到ClientContext。如果我不做其中一个技巧,执行将失败并出现不同的错误。

你有什么想法吗?

2 个答案:

答案 0 :(得分:1)

当你像这样添加ListItemCollectionPosition字段时似乎

ClientContext.Load(itemsCollection,items =&gt; items.ListItemCollectionPosition);

它会在请求中自动设置SelectAllProperties = true的值,然后阻止Computed列返回。

然后,您最终得到消息&#39;字段或属性&#34; XYZ&#34;不存在。&#39;

这仅发生在CSOM客户端组件的更高版本上,即架构版本15.0.0.0和库版本16.0.0.0

经过多次试验和错误后,我发现通过在单个调用中将其添加为第二个参数,这不会发生。

例如,以这种方式请求ID和ListItemCollectionPosition不会设置SelectAllProperties = true。

ClientContext.Load(listitems,items =&gt; items.Include(item =&gt; item [&#34; ID&#34;]),l =&gt; l.ListItemCollectionPosition);

我会建议它在库中是一个Bug,但这似乎可以绕过它。

答案 1 :(得分:0)

取决于type对象的List

例如,对于Generic Lists,可以检索LinkTitleLinkTitleNoMenu字段,如下所示:

//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,您应该指定LinkFilenameLinkFilenameNoMenu字段:

//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);