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

时间:2011-10-14 05:59:10

标签: petapoco

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中提供的Paged查询功能和MultiPoco查询的最佳方法是什么,因为提供的方法仅适用于单一返回类型?

1 个答案:

答案 0 :(得分:1)

这很复杂,特别是因为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。这意味着,您应该使用&#34;命令desc&#34;来完成您的SQL查询。例如。