使用PetaPoco分页映射关系

本文关键字:关系 映射 分页 PetaPoco 使用 | 更新日期: 2023-09-27 18:16:09

我正在使用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;
}

Person.cs

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

Category.cs

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

问题是它不会填充Person对象中的Category属性。据我所知,只有db.Fetch允许指定多种类型,但在这种情况下,我需要自己编写分页功能。

最好的方法是什么?

使用PetaPoco分页映射关系

您可以在iddatabase上使用扩展方法:

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}",…)for MySQL/SQLite/PostgreSQL/MSSQL 2012+.

我也花了一些时间来寻找如何使用Func<T1,>cb参数,在PetaPoco Fetch()文档中没有涉及。它是一个函数,它只是用连接表中的相关实体填充最终实体。下面是一个用法示例

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