在自动查询请求中,我指定了一个左联接,以便可以查询联接表中的属性。
$userInputURL.publisher()
.compactMap({ URL(string: $0) })
.flatMap({ URLSession(configuration: .ephemeral).dataTaskPublisher(for: $0).assertNoFailure() })
.eraseToAnyPublisher()
如果我使用标准的自动查询方式,例如:
public class ProductSearchRequest : QueryDb<Book>
, ILeftJoin<Book, BookAuthor>, ILeftJoin<BookAuthor, Author>
{}
正在请求100个,然后由于var q = AutoQuery.CreateQuery(request, base.Request);
var results = AutoQuery.Execute(request, q);
是基于左连接的结果,因此通常会少于100个。
为了解决这个问题,我改为这样做:
Take()
group by似乎返回正确的结果数,因此分页有效,但是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
};
返回0。
我也尝试过:
Total
但是即使var total2 = (int)Db.Count(q1);
有一个q1
,它也会返回结果数,包括左联接而不是实际查询
如何获取查询的真实总数?
(获取一些有关如何使用自动查询和左联接进行分页和总计的官方文档会非常有帮助,因为现在有点混乱)
答案 0 :(得分:0)
您的主要问题源于试图返回不同的总数,然后执行实际查询自动查询。如果您有多个左联接,则总数就是它执行的查询的总结果,而不是源表中的行数。
因此,您不是要查找“ True total”,而是要执行不同的查询以获取与已执行的查询不同的总计,但仍以原始查询为基础。首先,请考虑使用普通的INNER JOINS(IJoin<>
)而不是LEFT JOINS,这样它只返回联接表中相关行的结果,总和将相应地反映出来。
您返回0
的查询总数可能不会返回任何结果,因此,我将着眼于SQL事件探查器中的查询,以便您看到执行的查询。您还可以启用 Debug 日志记录并在您的AppHost中启用OrmLite查询的日志记录:
OrmLiteUtils.PrintSql();
还要注意,整个表中的GroupBy()
是不寻常的,通常您将按单个或多个显式选定的列进行分组,例如:
.GroupBy(x => x.Id);
.GroupBy(x => new { x.Id, x.Name });