簡體   English   中英

如何從SharePoint CSOM查詢中獲取唯一字段值?

[英]How can I get only unique field values from a SharePoint CSOM query?

我正在使用SharePoint客戶端對象模型從SharePoint 2013列表中檢索數據。 以下代碼有效,並從keyCol List字段中正確地排序了所有值:

string keyCol = "SPFieldName";
CamlQuery keyColumnValuesQuery = CamlQuery.CreateAllItemsQuery();
ListItemCollection keyColumnValues = srcDocLib.GetItems(keyColumnValuesQuery);
spContext.Load(keyColumnValues, items => items.Include(item => item[keyCol]), items => items.OrderBy(item => item[keyCol]));
spContext.ExecuteQuery();

但是,我只想為字段中的每個唯一值檢索一個項,即唯一項。 當我將Distinct()Linq / Lambda添加到Load方法的檢索參數時(沒有編譯時問題):

spContext.Load(keyColumnValues, items => items.Include(item => item[keyCol]), items => items.OrderBy(item => item[keyCol]), items => items.Distinct());

我收到一個InvalidQueryExpressionException:查詢表達式'items.Distinct()'不支持。

這是否意味着SharePoint方面的Linq提供程序不支持該表達式,而我對使用這種技術感到不滿意? 我做錯了什么嗎? 謝謝。

用於SharePoint的Linq提供程序不支持Distinct運算符。

根據MSDN:

某些LINQ查詢不能完全轉換為CAML。 但是,這些查詢原則上可以正確運行,因為它們可以分兩個階段執行。 首先,LINQ to SharePoint提供程序將盡可能多的查詢轉換為CAML並執行該查詢

有關更多詳細信息,請參考不支持的LINQ查詢和兩階段查詢

兩階段方法

要更正此錯誤,您應該將查詢分為兩個階段,以強制第一個查詢先於第二個查詢執行。 為此,例如,應使用ToList()方法轉換列表中的第一個IEnumerable<T>

下面的示例演示如何返回唯一值:

   //1 Execute query against SP Linq provider   
    string keyCol = "SPFieldName";
    CamlQuery keyColumnValuesQuery = CamlQuery.CreateAllItemsQuery();
    ListItemCollection keyColumnValues = srcDocLib.GetItems(keyColumnValuesQuery);
    spContext.Load(keyColumnValues, items => items.Include(item => item[keyCol]), items => items.OrderBy(item => item[keyCol]));
    spContext.ExecuteQuery();
    //2. Transform LiItemCollection to a List and perform Distinct operation 
    var uniqueKeyColumnValues = keyColumnValues.ToList().Select(i => i[keyCol]).Distinct(); 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM