添加分页MVC和Azure表存储

Hap*_*990 7 asp.net-mvc pagination azure

我试图将分页应用到我的MVC应用程序中.我使用Azure表存储

这是我尝试过的: -

public List<T> GetPagination(string partitionKey, int start, int take)
    {
        List<T> entities = new List<T>();

        TableQuery<T> query = new TableQuery<T>().Where(TableQuery.GenerateFilterCondition("PartitionKey", QueryComparisons.Equal, partitionKey.ToLower()));
        entities = Table.ExecuteQuery(query).Skip(start).Take(take).ToList();

        return entities;

    }
Run Code Online (Sandbox Code Playgroud)

控制器: -

public ActionResult Index()
        {

            key= System.Web.HttpContext.Current.Request[Constants.Key];
            if (String.IsNullOrEmpty(key))
                return RedirectToAction("NoContext", "Error");

            var items= _StorageHelper.GetPagination(key,0,3);
           ItemCollection itemCollection = new ItemCollection();
            itemCollection .Items= Mapper.Map<List<ItemChart>, List<ItemModel>>(items);
            itemCollection .Items.ForEach(g => g.Object = g.Object.Replace(key, ""));


            return View(itemCollection);
        }
Run Code Online (Sandbox Code Playgroud)

这当前给了我数据中的前3个条目.现在,我如何显示和实现"上一页"和"下一页"以显示下一页上的其他条目?如何实现控制器和HTML页面的其余部分?

任何帮助表示赞赏.

Gau*_*tri 14

在分页时,需要考虑以下几点:

  • 表服务不支持所有LINQ运算符(以及OData查询选项).例如Skip,不支持.有关支持的运营商列表,请访问此链接:https://msdn.microsoft.com/en-us/library/azure/dd135725.aspx.
  • 分页与表服务一起使用的方式是,当您查询表以获取某些数据时,表服务可以返回的最大实体数为1000.不能保证始终返回1000个实体.它可能小于1000甚至0,具体取决于您的查询方式.但是,如果有更多可用结果,Table Service将返回一个名为a的内容Continuation Token.您必须使用此标记从表服务中获取下一组结果.有关查询超时和分页的更多信息,请参阅此链接:https://msdn.microsoft.com/en-us/library/azure/dd135718.aspx.

考虑到这两个因素,您无法真正实现寻呼解决方案,用户可以直接跳转到特定页面(例如,用户坐在第1页,然后用户无法转到第4页).您最多可以实现下一页,上一页和第一页功能.

要实现next page某种功能,请存储表服务返回的延续令牌,并在查询中使用该令牌.

要实现previous page某种功能,必须存储在数组或其他内容中返回的所有连续标记,并跟踪用户当前所在的页面(即当前页面索引).当用户想要转到上一页时,您只需获取上一个索引的延续标记(即当前页面索引 - 1)并在查询中使用该标记.

要实现first page某种功能,只需在没有延续令牌的情况下发出查询.

ExecuteQuerySegmented如果要实现分页,请查看Storage Client Library 中的方法.

UPDATE

请参阅下面的示例代码.为简单起见,我只保留了第一页和下一页的功能:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using Microsoft.WindowsAzure.Storage.Auth;
using Microsoft.WindowsAzure.Storage.Blob;
using Microsoft.WindowsAzure.Storage;
using Microsoft.WindowsAzure.Storage.Queue;
using Microsoft.WindowsAzure.Storage.Table;
namespace TablePaginationSample
{
    class Program
    {
        static string accountName = "";
        static string accountKey = "";
        static string tableName = "";
        static int maxEntitiesToFetch = 10;
        static TableContinuationToken token = null;
        static void Main(string[] args)
        {
            var cloudStorageAccount = new CloudStorageAccount(new StorageCredentials(accountName, accountKey), true);
            var cloudTableClient = cloudStorageAccount.CreateCloudTableClient();
            var table = cloudTableClient.GetTableReference(tableName);
            Console.WriteLine("Press \"N\" to go to next page\nPress \"F\" to go first page\nPress any other key to exit program");
            var query = new TableQuery().Take(maxEntitiesToFetch);
            var continueLoop = true;
            do
            {
                Console.WriteLine("Fetching entities. Please wait....");
                Console.WriteLine("-------------------------------------------------------------");
                var queryResult = table.ExecuteQuerySegmented(query, token);
                token = queryResult.ContinuationToken;
                var entities = queryResult.Results;
                foreach (var entity in entities)
                {
                    Console.WriteLine(string.Format("PartitionKey = {0}; RowKey = {1}", entity.PartitionKey, entity.RowKey));
                }
                Console.WriteLine("-------------------------------------------------------------");
                if (token == null)//No more token available. We've reached end of table
                {
                    Console.WriteLine("All entities have been fetched. The program will now terminate.");
                    break;
                }
                else
                {
                    Console.WriteLine("More entities available. Press \"N\" to go to next page or Press \"F\" to go first page or Press any other key to exit program.");
                    Console.WriteLine("-------------------------------------------------------------");
                    var key = Console.ReadKey();
                    switch(key.KeyChar)
                    {
                        case 'N':
                        case 'n':
                            continue;
                        case 'F':
                        case 'f':
                            token = null;
                            continue;
                        default:
                            continueLoop = false;
                            break;
                    }
                }
            } while (continueLoop);
            Console.WriteLine("Press any key to terminate the application.");
            Console.ReadLine();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 我意识到这不会为讨论增加任何内容,但这可能是我访问 Stack Overflow 后最沮丧的一次。尽管如此,我还是很感谢@GauravMantri 和 Mike 的评论(上图)的回答。 (2认同)