如何从SharePoint CSOM查询中获得唯一的字段值?

本文关键字:唯一 字段 SharePoint CSOM 查询 | 更新日期: 2023-09-27 17:51:14

我正在使用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();

但是,我只想为字段中的每个唯一值检索一个Item,即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提供程序不支持这个表达式,而我只是不走运地使用了这个技术?我做错了什么吗?谢谢。

如何从SharePoint CSOM查询中获得唯一的字段值?

SharePoint的Linq provider不支持Distinct操作符。

根据MSDN:

一些LINQ查询不能完全转换为CAML。然而,然而,这样的查询在原则上可以正确运行,因为它们可以分两个阶段执行。首先,LINQ到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();