【问题标题】:OData substringof or startswith returning all itemsOData substringof 或以返回所有项目开始
【发布时间】:2013-04-12 14:46:03
【问题描述】:

我正在尝试过滤来自 Rest Call 的结果。

$.ajax({
    type: "GET",
    headers: {
        "Accept": "application/json;odata=verbose"
    },
    dataType: "JSON",
    url: _spPageContextInfo.webServerRelativeUrl + "/_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$startswith('Title','" + request.term + "') eq true",
    success: function (data) {
    },
    error: function (ex) {
    }
});

在我的联系人列表中,我正在尝试检索以字符串开头或其中包含字符串的项目的标题和 ID,例如这里是某人的姓名。

我也用 substringof 试过了:

"/_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$substringof(" + request.term + ",'Title') eq true"

这也提供了相同的结果。

它为我提供了列表中的所有列表项,并且没有应用过滤。 我在这里查看Programming using the SharePoint 2013 REST service 后为其余部分构建了 URL 就像那里给出的架构一样,我认为 Url 看起来不错,但似乎不是这样:)

编辑:

在 OData Uri 约定中应用 $filter 会出现以下错误:

{"error":{"code":"-1, Microsoft.SharePoint.SPException","message":{"lang":"en-US","value":"The query is not valid."}}}

尝试使用以下查询字符串:

_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$filter=substringof(m,'Title') eq true

_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$filter=substringof('m','Title') eq true

_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$filter=substringof('m',Title) eq true

【问题讨论】:

    标签: rest jquery odata sharepoint-2013


    【解决方案1】:

    当我删除“eq true”时,我已经设法让带有 substringof 的过滤器返回正确的结果。

    使用您的查询字符串之一,它应该像这样工作:

    _api/lists/getByTitle('Contacts')/items?$select=Title,Id&$filter=substringof('m',Title)
    

    我没有检查任何其他函数,但至少,startswith 函数也是如此。

    【讨论】:

      【解决方案2】:

      对于任何查看此问题的人,我可以报告

      /_api/web/lists/GetByTitle('Applications')/items?$filter=startswith(Title,'1AAJ') 
      

      为我工作。

      【讨论】:

        【解决方案3】:

        我在端点上尝试了您的查询 URI 并应用了一些更改: - 子字符串的第二个参数不应该是字符串,所以我去掉了撇号

        在这之后我得到了结果:

        http://jaydata.org/examples/Northwind.svc/Products?$select=Product_ID,Product_Name&$filter=substringof('CH',Product_Name)

        我的端点是标准 WCF 数据服务,并且过滤器正在工作。

        如果更改 URI 仍然返回所有记录,我猜这将是一个 SherePoint 技巧。如果你在过滤器中加入 'zzz' 或一些随机字符串会发生什么?

        【讨论】:

        • 用该字符串再次测试它,但它只返回相同的错误“查询无效。”当我使用 $filter 标签时
        【解决方案4】:

        检查 http://www.odata.org/documentation/odata-v2-documentation/uri-conventions/ 以获取正确的 uri 约定。

        应该是

        /_api/lists/getByTitle('Contacts')     
        /items?$select=Title,Id&$filter=substringof(" + request.term + ",'Title') eq true"
        

        所以包含 $filter

        【讨论】:

        • 请看我的编辑。当我应用 $filter 时,它给我一个错误,即查询格式不正确
        • 也许是因为 $select 的组合/顺序,它似乎应该工作。 sharepoint.mindsharpblogs.com/NancyB/Lists/Posts/…。你能试试只用过滤器吗?
        • 仅使用过滤器尝试了相同的错误返回。可能缺少一些东西,但我不明白。当我查看约定时,它看起来还不错
        【解决方案5】:

        另外,contains 方法有效,而且我对它有更好的兼容性。语法是:

        api/People?$filter=contains(LastName,%27Smith%27)&$select=LastName,FirstName
        

        【讨论】:

        • contains 参数确实有效,如 odata.org/getting-started/basic-tutorial 中所引用。这是更简单的过滤器部分匹配之一。我没有 Sharepoint 2013,因此无法对其进行测试,但它适用于任何使用现代和标准 OData 实现的人。
        • 对不起,我认为该主题与 SP 2013 有关。请您编辑您的答案,以便我可以删除我的反对票?谢谢
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-07-08
        • 2020-11-02
        • 1970-01-01
        • 2017-12-31
        • 2016-12-23
        • 2018-11-06
        • 1970-01-01
        相关资源
        最近更新 更多