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 serviceLike 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
5

Best Answer


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.

For anyone looking at this question, I can report that

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

IS working for me.

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?

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

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