Search code examples
jsonrestsharepointsharepoint-2010

Sharepoint 2010 Blog - Order rest query by Category


I've created a blog on Sharepoint 2010 and want to query the list via REST for reporting. I want to order the list by the default field Category (internal name PostCategory). Unfortunately, this is a multiselect field, therefore a simple "?$orderby=Category" doesn't work. I've also tried to expand the Category, but that doesn't work either.

Is there a chance, that I can order the list using rest? What about more then one selected Category? Can it be ordered by the first category, then the second, etc.?

If it's not possible using REST, what about ordering within JSON? I use a small javascript, that puts the list in a reporting format. Can I order within the JSON result?

Here is an example:

// Create REST-API URL
var strURL = "<REST-URL>";

// Get information from REST-API and create html output
$.getJSON(strURL, function(data) {
        <Create output>
    };

// Append to webpart
$('#<WebPartTitle>').append($(html));

EDIT: I've posted the question also here, since it's happening all in sharepoint


Solution

  • Category field (PostCategory internal name) is a multiple choice field, in SharePoint REST it is not supported to apply $orderby query option to this type of field.

    But you could sort returned items using JavaScript.


    The following example demonstrates how to order Posts by Category field.

    There is one important note here:

    Since Category field is a multiple choice field value, it is assumed that only one category could be specified per post.

    For that purpose FirstCategoryTitle property is introduced which represent the title of first category in post item. This property is used > for sorting items

    Example

    var endpointUrl = 'http://contoso.intranet.com/blog/_vti_bin/listdata.svc/Posts?$expand=Category';
    
    $.getJSON(endpointUrl, function(data) {
       var items  = data.d.results.map(function(item){
           item.FirstCategoryTitle = (item.Category.results.length > 0 ? item.Category.results[0].Title : '');   //get first category
           return item;
       });
       items.sort(postComparer);   //sort by category
       items.forEach(function(item){
         console.log(item.Title);    
       });
    
    });
    
    function postComparer(x,y) {
      return x.FirstCategoryTitle > y.FirstCategoryTitle;
    }