2014-04-25 42 views
2

我是新來的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:'Field or property "LinkTitle" does not exist.'

理論上我可以得到這些計算的字段。要做到這一點,我不需要加載ListItemCollectionPosition,只包含計算的字段到ClientContext。如果我不執行這些技巧之一,執行將失敗,並出現不同的錯誤。

你有什麼想法嗎?

回答

0

它取決於List對象的type。如下面所示

例如,對於Generic ListsLinkTitleLinkTitleNoMenu領域可以檢索:

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

看來,當你像這樣添加ListItemCollectionPosition字段時,ClientContext.Load(itemsCollection,items => items.ListItemCollectionPosition);

它自動設置請求中SelectAllProperties = true的值,然後阻止計算列返回。

然後,您將收到消息「字段或屬性」XYZ「不存在」。

這僅發生在的15.0.0.0的CSOM客戶端組件,即架構版本和庫版本16.0.0.0

多的反覆試驗後,以後的版本我已經發現,通過添加這是在第二個參數單個電話這不會發生。

例如,通過這種方式請求ID和ListItemCollectionPosition不會設置SelectAllProperties = true。 ClientContext.Load(listitems,items => items.Include(item => item [「ID」]),l => l.ListItemCollectionPosition);}}

我會建議它是在圖書館的一個錯誤,但這似乎解決它。