繁体   English   中英

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

[英]How can I get only unique field values from a SharePoint CSOM query?

我正在使用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查询和两阶段查询

两阶段方法

要更正此错误,您应该将查询分为两个阶段,以强制第一个查询先于第二个查询执行。 为此,例如,应使用ToList()方法转换列表中的第一个IEnumerable<T>

下面的示例演示如何返回唯一值:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM