PetaPoco很棒,涵盖paged queries和Multi-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中提供的Paged查询功能和MultiPoco查询的最佳方法是什么,因为提供的方法仅适用于单一返回类型?
答案 0 :(得分:1)
这很复杂,特别是因为PetaPoco想要支持旧的数据库系统。这意味着有一些像ROW_NUMBER()OVER ...这样的子句用于分页,当PetaPoco计算记录总数时,经常会发生冲突。考虑:
select * from articles join authors on articles.authorid = authors.id
如果您在id
和articles
表格中显示列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。这意味着,您应该使用&#34;命令desc&#34;来完成您的SQL查询。例如。