Получение нумерации AutoQuery для работы с левым соединением - PullRequest
1 голос
/ 04 июля 2019

В моем запросе 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(), он возвращает количество результатов, включая левое соединение, а не фактический запрос

Как я могу получить истинную сумму запроса?

(Получение некоторых официальных документов о том, как выполнять подкачку и итоги с помощью автозапроса и левого соединения, было бы очень полезно, поскольку сейчас это немного сбивает с толку)

1 Ответ

0 голосов
/ 04 июля 2019

Ваша основная проблема связана с попыткой вернуть итоговое значение, отличное от фактического запроса, который выполняет AutoQuery. Если у вас есть несколько левых объединений, итоговое значение представляет собой итоговый результат выполненного запроса, а не количество строк в исходной таблице.

Таким образом, вы не ищете «Истинную сумму», скорее, вы хотите выполнить другой запрос, чтобы получить иную сумму, отличную от выполненного запроса, но все еще основанную на исходном запросе. Сначала рассмотрите возможность использования обычных ВНУТРЕННИХ СОЕДИНЕНИЙ (IJoin<>) вместо ЛЕВЫХ СОЕДИНЕНИЙ, чтобы он возвращал результаты только для связанных строк в соединенных таблицах, которые будут соответственно отражаться в общей сумме.

Ваш общий запрос, который возвращает 0, скорее всего, не даст результатов, поэтому я посмотрю на запрос в SQL Profiler, чтобы вы могли увидеть, что запрос выполнен. Вы также можете включить ведение журнала запросов OrmLite с включенным ведением Debug и в вашем AppHost:

OrmLiteUtils.PrintSql();

Также обратите внимание, что GroupBy() всей таблицы необычен, обычно вы группируете по одному или нескольким явно выбранным столбцам, например:

.GroupBy(x => x.Id);
.GroupBy(x => new { x.Id, x.Name });
...