簡體   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