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