在我的自动查询请求中,我指定了一个左联接,以便可以查询联接表中的属性。

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 }; 

分组依据似乎返回正确的结果数,因此分页有效,但Total返回0。

我也尝试过:

var total2 = (int)Db.Count(q1); 

但是,即使q1具有GroupBy()它也会返回结果数,包括左联接而不是实际查询

如何获得查询的真实总数?

(获得一些有关如何使用自动查询和左联接进行分页和总计的官方文档会非常有帮助,因为现在有点混乱了)

===============>>#1 票数:0 已采纳

您的主要问题源于试图返回不同的总数,然后实际查询执行自动查询。 如果您有多个左联接,则总数是它执行的查询的总结果,而不是源表中的行数。

因此,您不是在寻找“真实的总数”,而是在寻找执行与所执行的查询不同的查询以获取与所执行的查询不同的总数,但仍以原始查询为基础。 首先考虑使用普通的INNER JOINS( IJoin<> )而不是LEFT JOINS,这样它只返回联接表中相关行的结果,其总和将相应地反映出来。

返回0总查询可能不会返回任何结果,因此,我将看一下SQL Profiler中的查询,以便可以看到已执行的查询。 您还可以在启用了Debug日志记录的AppHost中启用OrmLite查询的日志记录:

OrmLiteUtils.PrintSql(); 

还要注意,整个表的GroupBy()是不寻常的,通常您将按单个或多个显式选定的列进行分组,例如:

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

  ask by Guerrilla translate from so

本文未有回复,本站智能推荐: