问题
I'm trying to filter my results from a 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) {
}
});
In my Contacts List i'm trying to retrieve the Title and the Id for Items which start with a String or which have the String somewhere in it, here for example it is the Name of somebody.
I also tried it with substringof:
"/_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$substringof(" + request.term + ",'Title') eq true"
which delivers also the same result.
It gives me all List Items from the List and no Filtering is applied. I build the Url for the Rest after looking here Programming using the SharePoint 2013 REST service Like the Schema given there I think the Url looks ok, but it not seems so :)
Edit:
Applying the $filter
like in the OData Uri Conventions gives me the following error:
{"error":{"code":"-1, Microsoft.SharePoint.SPException","message":{"lang":"en-US","value":"The query is not valid."}}}
Tried it with following Query Strings:
_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
回答1:
I've managed to get the filter with substringof returning the correct results when I removed the "eq true".
Using one of your query strings, it should work like this:
_api/lists/getByTitle('Contacts')/items?$select=Title,Id&$filter=substringof('m',Title)
I haven't checked any other functions, but at least, the same happens with startswith function.
回答2:
For anyone looking at this question, I can report that
/_api/web/lists/GetByTitle('Applications')/items?$filter=startswith(Title,'1AAJ')
IS working for me.
回答3:
I tried your query URI on my endpoint and applied some changes: - The second parameter of the substring shouldn't be a string, so I removed the apostropes
After this I get the results:
http://jaydata.org/examples/Northwind.svc/Products?$select=Product_ID,Product_Name&$filter=substringof('CH',Product_Name)
My endpoint is standard WCF Data Service, and the filter is working.
If changing the URI still returns all records, that would be a SherePoint trick I guess. What happens if you put 'zzz' or some random string in the filter?
回答4:
Check http://www.odata.org/documentation/odata-v2-documentation/uri-conventions/ for the correct uri convention.
Should be
/_api/lists/getByTitle('Contacts')
/items?$select=Title,Id&$filter=substringof(" + request.term + ",'Title') eq true"
So with the $filter included
回答5:
Also, the contains method works and I've had better compatibility with it. The syntax is:
api/People?$filter=contains(LastName,%27Smith%27)&$select=LastName,FirstName
来源:https://stackoverflow.com/questions/16100697/odata-substringof-or-startswith-returning-all-items