#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».