【问题标题】:How can I get only unique field values from a SharePoint CSOM query?如何从 SharePoint CSOM 查询中仅获取唯一字段值?
【发布时间】:2014-03-22 20:46:48
【问题描述】:

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

【问题讨论】:

    标签: c# linq csom


    【解决方案1】:

    SharePoint 的 Linq 提供程序不支持 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(); 
    

    【讨论】:

    • 谢谢,这行得通,这正是我想要的。如果您不介意,请提出几个后续问题以供我理解。乍一看,我认为 uniqueKeyColumnValues 是 List 类型,但它似乎是 List 类型(实际上对我来说更可取)。代码的 Select 部分是否从 ListItem 字段而不是整个 ListItem 字段中提取字符串值?
    • 有一次我尝试了 keyColumnValues.ToList().Distinct(),但得到了与欺骗相同的结果。是不是因为我只给了它一个 List 来区分,而不是一系列值,从这个角度来看,它给我的 List 是真正独特的?
    • 没错,选择运算符提取字段值。例如,如果字段为 Text 类型,则查询返回 List
    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-04
    • 1970-01-01
    • 1970-01-01
    • 2015-12-13
    • 2012-03-07
    • 2021-12-21
    相关资源
    最近更新 更多