與小巧玲瓏的通用分頁

asp.net-mvc dapper generics pagination

我正在使用dapper和dapper.contrib.My問題是我如何創建一個通用的分頁類。這是我到目前為止所嘗試的內容。

 public class GenericRepository<T> :IGenericRepository<T> where T : class
    {
    public  async Task<IEnumerable<T>> GetAllPagedAsync(int limit,int offset)
        {
            var list = await Connection.GetAllAsync<T>();//but this return IEnumarable
            return list;

        }
}

我在想的是獲取類的T名稱與Table名稱相同,並編寫一個名為sql_statement的sql字符串,這是應用pagination.later應用此代碼。

 var list = await Connection.QueryAsync<T>("sql_statement")

這有意義嗎?我有更好的辦法來實現這一目標。

一般承認的答案

它看起來好像您計劃檢索表中的所有行,然後從中選擇您實際需要的數據頁。直接從數據庫中選擇您需要的頁面可能會更快,除非您出於某種原因確實需要所有行。

假設您的表名始終與其各自的類/實體名稱完全匹配,以下內容將為您提供分頁結果(使用postgres):

public class GenericRepository<T> : IGenericRepository<T> where T : class
        {
        public async Task<IEnumerable<T>> GetAllPagedAsync(int limit, int offset)
            {
                var tableName = typeof(T).Name;             
                // assuming here you want the newest rows first, and column name is "created_date"
                // may also wish to specify the exact columns needed, rather than *
                var query = "SELECT * FROM @TableName ORDER BY created_date DESC Limit @Limit Offset @Offset";
                var results = Connection.QueryAsync<T>(query, new {Limit = limit, Offset = offset});
                return results;
            }
    }

關於此的說明。我顯然不熟悉數據庫的結構或大小,但是對於大多數一般用途,這裡顯示的限制/偏移方法很可能就足夠了。但是,您可能希望考慮一些潛在的問題:

  1. 當偏移值變得非常大時,性能可能會受到影響。
  2. 以這種方式具有高頻率插入的分頁表可能導致結果被複製/出現在多個頁面上,因為偏移值沒有考慮自上次檢索以來添加到表中的新行。

無論這些是否可能對您的特定情況造成問題,這些潛在的缺點以及一些替代解決方案都在此處列出



許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因