在我的自动请求中,我指定了一个左JOIN,因此我可以在加入表中查询属性。
public class ProductSearchRequest : QueryDb<Book>
, ILeftJoin<Book, BookAuthor>, ILeftJoin<BookAuthor, Author>
{}
如果我使用标准的自动Query这样的方法:
var q = AutoQuery.CreateQuery(request, base.Request);
var results = AutoQuery.Execute(request, q);
和100被请求,然后由于Take()
是基于左联接的结果,通常会重新调整少于100。
为了解决这个问题,我正在这样做:
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
};
该组似乎返回正确数量的结果,因此分页有效,但Total
返回0。
我也尝试了:
var total2 = (int)Db.Count(q1);
但是,即使q1
具有GroupBy()
,它也返回了包括左JOIN在内的结果数,而不是实际的查询
如何获得查询的真实总计?
(获取一些有关如何使用AutoQuery&amp;左JOIN进行分页和总计的官方文档将非常有帮助,因为现在有点混乱(
您的主要问题源于尝试返回其他总数,而不是实际的查询自动执行。如果您有多个左连接,则总数是查询的总结果,它执行的不是源表中的行数。
因此,您不是在寻找" True Total",而是要执行其他查询以获得与执行的查询不同的总数,但仍来自原始查询作为其基础。首先考虑使用普通的内连接(IJoin<>
(而不是左连接,因此它仅返回相关行中相关行的结果,总计将相应地反映。
您返回0
的总查询可能是不返回的,因此我会考虑查看SQL Profiler中的查询,以便您可以查看已执行的查询。您还可以使用 debug 启用启用日志记录和在AppHost中启用Ormlite查询的记录:
OrmLiteUtils.PrintSql();
还请注意,整个表的GroupBy()
是不寻常的,通常会按单个或多个显式选定的列进行分组,例如:
.GroupBy(x => x.Id);
.GroupBy(x => new { x.Id, x.Name });