3

PetaPoco は素晴らしく、ページ化されたクエリMulti-Poco マッピングをカバーしていますが、それらを一緒に行う方法があるかどうかを調べていますか?

編集:

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 クエリで使用するための最良のアプローチは何かということだと思います。

4

1 に答える 1

1

特に PetaPoco は古い DB システムをサポートしたいため、複雑です。これは、ページネーションのために ROW_NUMBER() OVER... のような句が使用されていることを意味し、PetaPoco がレコードの総数をカウントしているときに、しばしば競合が発生します。検討:

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

列の名前idarticlesテーブルauthorsがある場合、自動生成されたクエリで競合が発生します。

解決

OFFSET / FETCH NEXT をサポートする新しいバージョンの SQL Server を使用する場合は、目的に合わせて、PetaPoco の別のメソッドを使用する簡単なメソッドを作成できます。鉄:

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 クエリを終了する必要があります。

于 2014-09-17T19:02:12.740 に答える