В моем запросе AutoQuery указано левое соединение, чтобы я мог запрашивать свойства в объединенной таблице.
public class ProductSearchRequest : QueryDb<Book>
, ILeftJoin<Book, BookAuthor>, ILeftJoin<BookAuthor, Author>
{}
Если я использую стандартный способ автозапроса, вот так:
var q = AutoQuery.CreateQuery(request, base.Request);
var results = AutoQuery.Execute(request, q);
И запрашивается 100, тогда часто меньше 100 будет перенастроено, поскольку Take()
основано на результатах с левым соединением.
Чтобы исправить это, я делаю это вместо:
var q = AutoQuery.CreateQuery(request, base.Request);
q.OrderByExpression = null //throws error if orderby exists
var total = Db.Scalar<int>(q.Select(x => Sql.CountDistinct(x.Id))); //returns 0
var q1 = AutoQuery.CreateQuery(request, base.Request).GroupBy(x => x);
var results = Db.Select<Book>(q1);
return new QueryResponse<Book>
{
Offset = q1.Offset.GetValueOrDefault(0),
Total = total
Results = results
};
Похоже, что group by возвращает правильное количество результатов, поэтому подкачка работает, но Total
возвращает 0.
Я тоже пробовал:
var total2 = (int)Db.Count(q1);
Но даже если q1
имеет GroupBy()
, он возвращает количество результатов, включая левое соединение, а не фактический запрос
Как я могу получить истинную сумму запроса?
(Получение некоторых официальных документов о том, как выполнять подкачку и итоги с помощью автозапроса и левого соединения, было бы очень полезно, поскольку сейчас это немного сбивает с толку)