首页 > 解决方案 > Asp.net核心分页不适用于数据表存储过程

问题描述

我收到此错误:

处理请求时发生未处理的异常。
NotImplementedException:方法或操作未实现。
PaginatedList.cs 中的 Portal.Models.PaginatedList.CreateAsync(object p, int v, int pageSize),第 47 行

控制器:

public async Task<IActionResult> Index(string sortOrder,
                                       string currentFilter,
                                       string searchString,
                                       int? pageNumber)
{
    List<StudentViewModal> listOfStudents = new List<StudentViewModal>();

    DataTable dataTable = new DataTable();

    using (SqlConnection sqlConnection = new SqlConnection(_configuration.GetConnectionString("SCHOOL")))
    {
        sqlConnection.Open();

        SqlDataAdapter sqlDa = new SqlDataAdapter("proc_GetStudents", sqlConnection);
        sqlDa.SelectCommand.CommandType = CommandType.StoredProcedure;
        sqlDa.Fill(dataTable);

        foreach (DataRow dr in dataTable.Rows)
        {
            listOfStudents.Add(
                new StudentViewModal
                {
                    ID = Convert.ToInt32(dr["ID"]),
                    Name = Convert.ToString(dr["Name"]),
                });
        }
    }

    int pageSize = 3;

    return View(await PaginatedList<StudentViewModal>.CreateAsync(listOfStudents, pageNumber ?? 1, pageSize));
}

这是分页助手类:

namespace Portal.Models.Referral
{
    public class PaginatedList<T> : List<T>
    {
        public int PageIndex { get; private set; }
        public int TotalPages { get; private set; }

        public PaginatedList(List<T> items, int count, int pageIndex, int pageSize)
        {
            PageIndex = pageIndex;
            TotalPages = (int)Math.Ceiling(count / (double)pageSize);

            this.AddRange(items);
        }

        public bool HasPreviousPage
        {
            get
            {
                return (PageIndex > 1);
            }
        }

        public bool HasNextPage
        {
            get
            {
                return (PageIndex < TotalPages);
            }
        }

        public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)
        {
            var count = await source.CountAsync();
            var items = await source.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToListAsync();
            return new PaginatedList<T>(items, count, pageIndex, pageSize);
        }

        internal static Task<object> CreateAsync(object p, int v, int pageSize)
        {
            throw new NotImplementedException();
        }
    }
}

标签: c#asp.net-core

解决方案


Asp.net 核心分页与实体框架一起查询数据库并仅返回某些数据。由于运行存储过程返回所有数据,因此分页不再有用,因为所有可能不需要的数据都已经到达。我们进行分页的原因之一是减少时间而不是获取现在不需要的额外数据。如果我们喜欢在视图中进行分页,那么我们可以使用 JavaScript 库。否则分页需要在存储过程中完成,或者如果我们希望 Asp.net 核心为我们进行分页,那么我们需要切换到实体框架并在 C# 中使用 LINQ 查询。


推荐阅读