I have implemented Odata query syntax for my web api. I am successfully able to return only the first 10 results and the link for the further results. However I am unable to extract this link from the JSON object that is returned by the server using my angularjs front end.

Say the server is responding as follows:

{ "odata.metadata":"","value":[ { "id":001,"name":"abc" },{ "id":002,"name":"pqr" },{ "id":003,"name":"xyz" },{ . . . ],"odata.nextLink":"" } 

Now I am displaying the data by using the success method of $http by assigning the returned data to a variable and using ng-repeat. I am assigning it as follows:

.success(function(data)){ $scope.foo = data.value; } 

However when I try to access the next link using:

$scope.link = data.odata.nextLink; 

within the success method it gives me an error. What am I missing over here? How else can I access the link returned? Is there any other method to implement server side paging?

5 Answers

I had the same problem, more or less. I guess it has got to do with JavaScript objects and how their properties are referred to. The reference

data.odata.nextLink 

would mean there is a property "odata" with a sub-property/field "nextLink". This is not the case, "odata.nextLink" is the name of the property. I don't know why OData is like this.

I got the contents of this property by using a string reference i.e.

data['odata.nextLink'] 

Don't know if there is some drawback, but seems to work...

 using Newtonsoft.Json; [JsonProperty("@odata.nextLink")] public string nextPage { get; set; } 

I got it to work using

theReturnedObject['@odata.nextLink'] 

Don't forget that the odata values should have an @ in front of them. I'm not sure how your implementation handles that character but it should be a valid prefix.

The issue I am running into is that some providers use the full path and some only use a relative path from the service endpoint.

The C# method that I devised for use with the Microsoft Graph API is as follows.

private static string GetNextLink ( JObject pjobjResult ) { JProperty jtLastToken = ( JProperty ) pjobjResult.Last; if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) ) { return jtLastToken.Value.ToString ( ); } // TRUE (There is at least one more page.) block, if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) ) else { return SpecialStrings.EMPTY_STRING; } // FALSE (The current page is the last one.) block, if ( jtLastToken.Name.Equals ( @"@odata.nextLink" ) ) } // private static string GetNextLink 

In the above method, SpecialStrings.EMPTY_STRING is the name of a true constant that I use in lieu of string.Empty.

A similar method should work for PowerShell, too.

Your Answer

Sign up or log in

Sign up using Google Sign up using Facebook Sign up using Email and Password

Post as a guest

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge that you have read and understand our privacy policy and code of conduct.