gpt4 book ai didi

petapoco - 使用Petapoco进行分页,多Poco查询?

转载 作者:行者123 更新时间:2023-12-04 17:47:02 26 4
gpt4 key购买 nike

PetaPoco很棒,涵盖了paged queriesMulti-Poco mapping,但是我试图弄清楚是否有办法将它们组合在一起?

编辑:

这是我用来获取MultiPoco数据的存储库方法:

// variables, used in multiple repo methods
private readonly string _selectClause = String.Format(@"SELECT * FROM Clients
OUTER APPLY
(SELECT TOP 1* From Events
WHERE Events.EndDateTime >= '{0}'
AND Events.ClientId = Clients.Id
) Events
WHERE Clients.TenantId=@0", DateTime.UtcNow);

private readonly string _orderbyClause = "ORDER BY Clients.Lastname";

// method

public new IEnumerable<Client> AllByTenantAndStatus(Status status)
{
string sql = String.Format("{0} AND Clients.Status=@1 {1}", _selectClause, _orderbyClause);

// using external relator
// return Db.Fetch<Client, Event, Client>(new ClientEventRelator().MapIt,
// sql, _tenantResolver.CurrentTenantId, status);

return Db.Fetch<Client, Event>(sql, _tenantResolver.CurrentTenantId, status);
}


Petapoco.cs中的方法声明

public Page<T> Page<T>(long page, long itemsPerPage, string sql, params object[] args) 




public void BuildPageQueries<T>(long skip, long take, string sql, ref object[] args, out string sqlCount, out string sqlPage) 


两者都接受单个返回类型参数。

所以我想我的问题是,将PetaPoco提供的分页查询功能与MultiPoco查询一起使用的最佳方法是什么,因为提供的方法仅适用于单个返回类型?

最佳答案

这很复杂,尤其是因为PetaPoco希望支持旧的数据库系统。这意味着使用诸如ROW_NUMBER()OVER ...这样的子句进行分页,并且当PetaPoco计算记录总数时,通常会发生冲突。考虑:

select * from articles join authors on articles.authorid = authors.id


如果您在 idarticles表上具有列 authors的名称,则自动生成的查询中将存在冲突。



如果您要使用支持OFFSET / FETCH NEXT的新版本的SQL Server,则可以针对您的目的编写简单的方法,该方法将使用PetaPoco的其他方法。 F.e .:

public partial class Database // Create Database class partial and extend it
{
public Page<TRet> PagedFetch<T1, T2, T3, TRet>(long page, long itemsPerPage, Func<T1, T2, T3, TRet> cb,
string sql, params object[] args)
{
string sqlCount, sqlPage;
BuildPageQueries<TRet>((page - 1) * itemsPerPage, itemsPerPage, sql, ref args, out sqlCount, out sqlPage);

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

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

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

result.TotalPages = result.TotalItems/itemsPerPage;

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

return result;
}
}


最后,别忘了,只有在对数据进行排序后,才可以使用OFFSET。这意味着,您应该使用“ order by something desc”完成SQL查询。

关于petapoco - 使用Petapoco进行分页,多Poco查询?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7763632/

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