繁体   English   中英

Asp.net 核心分页不适用于数据表存储过程

[英]Asp.net core pagination not working on datatable stored procedure

我收到此错误:

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

Controller:

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));
}

这是分页助手 class:

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();
        }
    }
}
internal static Task<object> CreateAsync(object p, int v, int pageSize)

被调用而不是

public static async Task<PaginatedList<T>> CreateAsync(IQueryable<T> source, int pageIndex, int pageSize)

因为每个参数都匹配“object p”,包括 IQueryable 类型的参数

您必须使参数 p 更具体或实际实现该方法。

更多详情:

这是导致您的问题的原因:

 throw new NotImplementedException();

如果您实现(编写实际的功能代码)您的错误将 go 消失。

但为什么它会在代码中达到最高点(第 47 行)

原因是 List listOfStudents 也是一个 object 类型,因为 C# 中的所有内容都扩展了 object。 所以这意味着

CreateAsync(listOfStudents, pageNumber ?? 1, pageSize)

匹配的签名

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

它被调用并抛出 NotImplementedException。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM