Страничные многопоко-запросы с Petapoco?

PetaPoco великолепен и охватывает постраничные запросы и 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) 

оба из них принимают один параметр возвращаемого типа.

Итак, я предполагаю, что мой вопрос заключается в том, как лучше всего использовать функциональность Paged-запроса, предоставленную в PetaPoco, с запросами MultiPoco, поскольку предоставленный метод работает только с одним типом возврата?


person seekay    schedule 14.10.2011    source источник
comment
Вам нужно будет предоставить более подробную информацию о вашей проблеме, чтобы кто-нибудь помог. Проблем с постраничным мультипоко-маппингом быть не должно.   -  person Typo Johnson    schedule 17.10.2011
comment
@Gareth, подробности добавлены выше. Надеюсь, теперь вопрос имеет больше смысла   -  person seekay    schedule 19.10.2011
comment
Есть ли ошибка в _selectClause = string.Format ()? Вы используете {1}, но у Format () есть только один параметр, поэтому он должен быть {0}   -  person Typo Johnson    schedule 20.10.2011
comment
Извините, это была опечатка в вопросе, {0} был Clients.TenantId, но я поместил это в сам sql и забыл изменить {1] на {0}   -  person seekay    schedule 23.10.2011
comment
Старый вопрос, который я знаю, но просто интересно, нашли ли вы решение для этого @seekay?   -  person Andy Butland    schedule 11.08.2014


Ответы (1)


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

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

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

РЕШЕНИЕ

Если вы хотите работать с новой версией SQL Server, которая поддерживает OFFSET / FETCH NEXT, вы можете написать простой метод для ваших целей, который будет использовать другие методы из 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 только после того, как отсортировали данные. Это означает, что вы должны завершить свой SQL-запрос, например, «упорядочить по чему-то по убыванию».

person Miroslav Holec    schedule 17.09.2014