Многостраничные запросы с несколькими Poco с помощью Petapoco?

#petapoco

#petapoco

Вопрос:

PetaPoco великолепен и охватывает многостраничные запросы и сопоставление с несколькими 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, поскольку предоставленный метод работает только с одним возвращаемым типом?

Комментарии:

1. Вам нужно будет предоставить более подробную информацию о вашей проблеме, чтобы кто-нибудь мог помочь. Не должно быть проблем с многостраничным отображением multipoco

2. @Gareth, добавил больше деталей выше. Надеюсь, теперь вопрос имеет больше смысла

3. Есть ли ошибка в строке _selectClause = . Форматировать ()? Вы используете {1}, но для Format() есть только один параметр, поэтому он должен быть {0}

4. Извините, что здесь в вопросе была опечатка, {0} было клиентами. TenantId, но я поместил его в сам sql и забыл изменить {1] на {0}

5. Старый вопрос, который я знаю, но просто интересно, нашли ли вы решение для этого @seekay?

Ответ №1:

Это сложно, особенно потому, что PetaPoco хочет поддерживать старые системы БД. Это означает, что для разбивки на страницы используются такие предложения, как ROW_NUMBER() НАД …, и когда PetaPoco подсчитывает общее количество записей, часто возникают конфликты. Рассмотрим:

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

В случае, если у вас будет имя столбца id articles и authors таблицы, в автоматически сгенерированных запросах возникнет конфликт.

РЕШЕНИЕ

Если вы хотите работать с новой версией 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 resu<
    }
}
  

Наконец, не забывайте, что вы можете использовать смещение только после сортировки данных. Это означает, что вы должны завершить свой SQL-запрос, например, «order by something desc».