OData的substringof或startswith返回所有项目

9

我正在尝试从Rest调用中过滤我的结果。

$.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"

这也会得到相同的结果。

它为我提供了来自列表的所有列表项,并且没有应用过滤器。 在查看此处使用SharePoint 2013 REST服务进行编程后,我构建了Rest的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
5个回答

19

当我去掉"eq true"时,我成功地使用包含substringof筛选器返回了正确的结果。

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

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

我没有检查过其他函数,但至少startswith函数也会发生同样的情况。


10

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

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

对我来说有效。


0

请看我的编辑。当我应用 $filter 时,它会给出一个错误,指出查询格式不正确。 - Mark
也许是由于$select的组合/顺序,它似乎应该工作。 http://sharepoint.mindsharpblogs.com/NancyB/Lists/Posts/Post.aspx?List=b6efd474-248a-4b16-ab88-afdb6fa31b65&ID=25。 你可以尝试只使用筛选器吗? - Rolfvm
仅使用过滤器仍然返回相同的错误。可能有些东西丢失了,但我不明白。当我查看约定时,它看起来还不错。 - Mark

0

我在我的端点上尝试了您的查询URI并进行了一些更改: - substring的第二个参数不应该是一个字符串,所以我删除了单引号

此后,我得到了以下结果:

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

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

如果更改URI仍然返回所有记录,那可能是SharePoint的技巧。如果在过滤器中输入'zzz'或一些随机字符串会发生什么?


我已经用那个字符串再次测试了它,但是当我使用$filter标签时,它仍然只返回相同的错误信息“查询无效”。 - Mark

-1
此外,contains方法可用且兼容性更好。语法为:
api/People?$filter=contains(LastName,%27Smith%27)&$select=LastName,FirstName

包含参数绝对有效,如http://www.odata.org/getting-started/basic-tutorial/所述。这是较容易的过滤器部分匹配之一。我没有Sharepoint 2013,因此无法针对它进行测试,但对于任何使用现代和标准的OData实现的人都有效。 - lyndon hughey
2
抱歉,是我的错误,我以为这个主题与SP 2013有关。请问你能否编辑你的回答,这样我就可以取消我的踩了吗?谢谢。 - Alberto S.

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接