簡體   English   中英

使用 PetaPoco 分頁映射關系

[英]Mapping relationships using PetaPoco paging

我正在使用 PetaPoco v5.1.228.0,我正在嘗試使用分頁(每頁 30 項)獲取人員列表以及他們所屬的類別。

這是我的代碼:

IEnumerable<Person> people;
var sql = new Sql("SELECT * FROM Person p INNER JOIN Category c ON p.CategoryId = c.Id");

using (var db = GetDatabaseConnection()) {
   var paging = db.Page<Person>(currentPage, 30, sql);
   people = paging.Items;
}

人物.cs

public class Person {
   public int Id { get; set; }
   public string Name { get; set; }
   public int CategoryId { get; set; }
   public Category Category { get; set; }
}

類別.cs

public class Category {
   public int Id { get; set; }
   public string Name { get; set; }
}

問題是它不會填充 Person object 中的類別屬性。據我所知,只有db.Fetch允許指定多個類型,但在這種情況下,我需要自己編寫分頁功能。

最好的方法是什么?

您可以通過IDatabase上的擴展元數據來執行此操作:

public static Page<TRet> PagedFetch<T1, T2, TRet>(this PetaPoco.IDatabase db, long page, long itemsPerPage, Func<T1, T2, TRet> cb, string sql, params object[] args)
        {
            SQLParts parts;
            if (!db.Provider.PagingUtility.SplitSQL(sql, out parts))
                throw new Exception("Unable to parse SQL statement for paged query");

            db.Provider.BuildPageQuery((page - 1) * itemsPerPage, itemsPerPage, parts, ref args);

            sql = string.Format("{0} offset {1} rows fetch next {2} rows only", sql, (page - 1) * itemsPerPage, itemsPerPage);

            var data = db.Fetch(cb, sql, args);

            var result = new Page<TRet>
            {
                Items = data,
                TotalItems = db.ExecuteScalar<long>(parts.SqlCount),
                CurrentPage = page,
                ItemsPerPage = itemsPerPage
            };

            result.TotalPages = result.TotalItems / itemsPerPage;

            if ((result.TotalItems % itemsPerPage) != 0)
                result.TotalPages++;

            return result;
        }

@Andres R:有用的答案,但代碼僅適用於 MSSQL。 使用這個: string.Format( "{0} LIMIT {2} OFFSET {1}" , ...) 適用於 MySQL/SQLite/PostgreSQL/MSSQL 2012+。

我還花了一些時間來找到如何使用Func<T1, T2, TRet> cb參數,PetaPoco Fetch() 文檔中沒有介紹該參數。 它是一個 function,它只是用連接表中的相關實體填充您的最終實體。 這是一個用法示例

var page = PagedFetch<DataSet, User, DataSet>(
  page, 
  itemsPerPage, 
  (ds, usr) => { ds.user = usr; return ds; }, 
  sql, 
  whereArguments);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM