1

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

ただし、フィールド内の一意の値ごとに 1 つのアイテムだけを取得したいと思います。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 プロバイダーがその式をサポートしていないということでしょうか? 私は何か間違ったことをしていますか?ありがとう。

4

1 に答える 1

2

DistinctSharePoint の Linq プロバイダーは演算子をサポートしていません。

MSDNによると:

一部の LINQ クエリは、CAML に完全に変換できません。ただし、このようなクエリは 2 段階で実行できるため、原則として正しく実行できます。まず、LINQ to SharePoint プロバイダーは、可能な限り多くのクエリを CAML に変換し、そのクエリを実行します。

詳細については、サポートされていない LINQ クエリと 2 段階クエリを参照してください。

二段階アプローチ

このエラーを修正するには、クエリを 2 段階に分割して、最初のクエリを 2 番目のクエリの前に強制的に実行する必要があります。これを行うには、たとえば、メソッドIEnumerable<T>のおかげでリストの最初を変換する必要がありますToList()

次の例は、一意の値を返す方法を示しています。

   //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(); 
于 2014-03-22T12:36:17.947 に答える