gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 12:56:36 27 4
gpt4 key购买 nike

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

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com