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

但是,我只想为字段中的每个唯一值检索一个项目,即 Distinct。当我将 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

SharePoint 的 Linq 提供程序不支持Distinct运算符。

根据 MSDN:

某些 LINQ 查询无法完全转换为 CAML。但是,原则上此类查询可以正确运行,因为它们可以分两个阶段执行。首先,LINQ to SharePoint 提供程序将尽可能多的查询转换为 CAML,并执行该查询

有关更多详细信息,请参阅不支持的 LINQ 查询和两阶段查询

两阶段方法

要更正此错误,您应该将查询分成两个阶段,以强制在第二个查询之前执行第一个查询。为此,您应该例如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 回答