我正在使用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()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的Linq提供程序不支持Distinct
运算符。
根据MSDN:
某些LINQ查询无法完全转换为CAML。但是,这些查询原则上可以正确运行,因为它们可以分两个阶段执行。首先,LINQ to SharePoint提供程序将尽可能多的查询转换为CAML并执行该查询
有关更多详细信息,请参考不支持的LINQ查询和两阶段查询。
要更正此错误,您应该将查询分为两个阶段,以强制第一个查询先于第二个查询执行。为此,例如,应使用method转换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();
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句