如何从SharePoint CSOM查询中仅获取唯一字段值?

时间:2014-03-21 20:58:51

标签: c# linq csom

我正在使用SharePoint客户端对象模型从SharePoint 2013列表中检索数据。以下代码有效,并从keyCol列表字段中获取所有值,正确排序:

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提供程序不支持该表达式,我只是运气不好使用这种技术?我做错了什么吗?感谢。

1 个答案:

答案 0 :(得分:2)

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

根据MSDN:

  

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

请参阅Unsupported LINQ Queries and Two-stage Queries了解更多详情。

两阶段方法

要更正此错误,您应该分两个阶段剪切查询,以强制第一个查询在第二个查询之前执行。为此,您应该例如通过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();