通过NetFlix odata结果进行分页

woa*_*sie 2 netflix wcf-data-services odata

我正在玩Netflix odata服务,以更好地了解如何使用odata数据.

在VS 2010中,我添加了对NetFlix odata服务的服务引用.然后我写了这个代码,它只返回一些数据.

        var cat = new NetflixCatalog(new Uri("http://odata.netflix.com/v1/Catalog/"));

        var x = from t in cat.Titles
                where t.ReleaseYear == 2009
                select t;

        foreach (Title title in x)
        {
            ProcessTitle(title);
        }
Run Code Online (Sandbox Code Playgroud)

我查看了为调用生成的uri并在浏览器中运行它.它返回的原子进给最后有这个元素

  <link rel="next" href="http://odata.netflix.com:20000/v1/Catalog/Titles()/?$filter=ReleaseYear%20eq%202009&amp;$orderby=AverageRating%20desc&amp;$skiptoken=3.9D,'BVqRa'" />
Run Code Online (Sandbox Code Playgroud)

这是一个将检索下一组数据的链接(由Netflix完成的分页).我的问题是如何让我的代码访问下一批数据和下一批数据?

Vit*_*SFT 7

查询可以转换为DataServiceQuery,它有一个名为Execute的方法,它返回结果QueryOperationResponse,它有一个GetContinuation方法,它返回一个表示下一个链接的continuation对象.浏览所有标题的粗略代码可能如下所示:

var cat = new NetflixCatalog(new Uri("http://odata.netflix.com/v1/Catalog/"));

var x = from t in cat.Titles
        where t.ReleaseYear == 2009
        select t;
var response = (QueryOperationResponse<Title>)((DataServiceQuery<Title>)x).Execute();

while (true)
{
    foreach (Title title in response)
    {
        Console.WriteLine(title.Name);
    }

    var continuation = response.GetContinuation();
    if (continuation == null)
    {
        break;
    }

    response = cat.Execute(continuation);
}
Run Code Online (Sandbox Code Playgroud)

  • 服务器驱动的分页只是前向的.所以它真的只能进入下一页.您必须自己记住上一页.也许如果您使用客户端驱动的分页会更好.例如〜/ Titles?$ top = 10&$ skip = 20(这将获得第10页的第3页).如果您的最高值小于服务器上的页面大小限制,则根本不会看到延续.您可以轻松计算要为上一个和下一个按钮点击的URL. (2认同)