使用联接时AutoQuery / OrmLite总值不正确

时间:2019-06-23 19:23:04

标签: servicestack

我有这个自动查询实现

var q = AutoQuery.CreateQuery(request, base.Request).SelectDistinct();

var results = Db.Select<ProductDto>(q);

return new QueryResponse<ProductDto>
{
    Offset = q.Offset.GetValueOrDefault(0),
    Total = (int)Db.Count(q),
    Results = results
};

该请求具有一些联接:

public class ProductSearchRequest : QueryDb<GardnerRecord, ProductDto>
    , ILeftJoin<GardnerRecord, RecordToBicCode>, ILeftJoin<RecordToBicCode, GardnerBicCode>
{

}

记录已正确返回,但总数错误。我可以在数据库中看到40,000条记录,但它告诉我有90,000条记录。每个RecordToBicCode都有多个GardnerRecord,因此它给了我记录数量乘以RecordToBicCode的数量。

如何将总数与符合查询条件的GardnerRecord的数量相匹配?

我正在使用PostgreSQL,因此需要count语句像

select count(distinct r.id) from gardner_record r etc...

OrmLite是否有办法做到这一点?

我尝试过:

            var q2 = q;
            q2.SelectExpression = "select count(distinct \"gardner_record\".\"id\")";
            q2.OrderByExpression = null;
            var count = Db.Select<int>(q2);

但是我得到对象引用未设置错误。

1 个答案:

答案 0 :(得分:0)

对于已离开联接的查询,自动查询将返回正确的总数,因此自然会返回比原始源表更多的结果。

您可以使用以下方法执行不重复计数:

Total = Db.Scalar<long>(q.Select(x => Sql.CountDistinct(x.Id));