让自动分页与左JOIN一起工作



在我的自动请求中,我指定了一个左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 });

最新更新