c# - 使用 PetaPoco 分页映射关系

标签 c# sql-server petapoco

我正在使用 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 允许指定多个类型,但在这种情况下,我需要自己编写分页功能。

最好的方法是什么?

最佳答案

您可以使用基于 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;
        }

关于c# - 使用 PetaPoco 分页映射关系,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40395854/

相关文章:

c# - 我可以在类库中向 AppDomain.CurrentDomain.UnhandledException 添加处理程序吗

c# - 如何以最简单的方式在 V 2010Express C# 中创建 MRU?

java - 针对 Hyper-V VM 中运行的 SQL Server 诊断缓慢的 JDBC 选择语句

sql-server - 是否可以在 OLE DB 连接管理器下的 SSIS 包内使用多个数据源?

DotnetNuke 7 对空间数据类型的支持

c# - 为性能计数器安装 Total 实例

c# - 将日期单元格从 Excel 导入到 ASP SQL DB 时包含时间

javascript - 如何从表中读取sql数据并将其放入nodejs中的变量?

vb.net - 传递匿名类型 VB.NET

stored-procedures - PetaPoco 和存储过程的输出参数?