【问题标题】:Total results of paged projected nhibernate query with aggregates具有聚合的分页投影 nhibernate 查询的总结果
【发布时间】:2011-10-20 17:50:52
【问题描述】:

我正在动态构建一个需要实现分页的休眠投影查询。有点像...

var projections = Projections.ProjectionList();
foreach (var p in projection.Projections)
{
    IProjection newProjection = null;
    switch (p.AggregateFunc)
    {
        case AggregateFuncTypeEnum.GroupProperty:
            newProjection = Projections.GroupProperty(p.Path);
            break;
        case AggregateFuncTypeEnum.Sum:
            newProjection = Projections.Sum(p.Path);
            break;
        default:
            newProjection = Projections.Property(p.Path);
            break;
    }
    projections.Add(newProjection, p.Name);
}
criteria.SetProjection(projections).SetResultTransformer(new AliasToBeanResultTransformer(projectionType));

我可以像这样得到前 15 个结果

criteria.SetFirstResult(0);
criteria.SetMaxResults(15);
var results = criteria.List();

但我还需要发送另一个查询来获取记录总数,但到目前为止我还没有弄清楚这一点。仍然需要应用投影,即如果结果按“代码”和“成本”之和进行分组,那么 100 条记录可能会返回 20 行,这就是我感兴趣的 20 行。

如何获取将返回的记录总数?谢谢

【问题讨论】:

    标签: c# sql-server nhibernate


    【解决方案1】:

    也许是这样的:

    var rowcount = CriteriaTransformer.Clone(criteria);
    
    var goupprojections = Projections.ProjectionList();
    var projections = Projections.ProjectionList();
    foreach (var p in projection.Projections)
    {
        IProjection newProjection = null;
        switch (p.AggregateFunc)
        {
            case AggregateFuncTypeEnum.GroupProperty:
                newProjection = Projections.GroupProperty(p.Path);
                goupprojections.Add(Projections.GroupProperty(p.Path), p.Name);
                break;
            case AggregateFuncTypeEnum.Sum:
                newProjection = Projections.Sum(p.Path);
                break;
            default:
                newProjection = Projections.Property(p.Path);
                break;
        }
        projections.Add(newProjection, p.Name);
    }
    criteria.SetProjection(projections).SetResultTransformer(new AliasToBeanResultTransformer(projectionType));
    
    if (goupprojections.Aliases.Length == 0)
    {
        rowcount.SetProjection(Projections.RowCount())
    }
    else
    {
        rowcount.SetProjection(Projections.Count(goupprojections))
    }
    
    var results = criteria.Future();
    var count = rowcount.FutureValue<int>();
    

    【讨论】:

    • 这似乎仍然返回例如计数100 而不是投影返回的 20 行(例如,按“代码”分组,总和为“成本”)
    • rowcount.SetProjection(Projections.Count(goupprojections)) 应该做 imo,我会检查
    • 看起来应该,但至少对我来说不是。使用您的想法,我可以使用 CountDistinct 选择一个要分组的属性,但这只接受一个属性
    • 我可以确认,如果我 Projections.Count(Projections.Distinct(projlist)) 然后 NH 在 distinct 中插入 as 并执行 sql,似乎 SQLlite 在 Distinct 中不支持超过 1 个属性,所以我无法在这里进一步测试
    • 'rowcount.SetProjection(Projections.Count(goupprojections))' 确实会产生 Count put 忽略分组。 "SELECT Count(prop) FROM table GROUP BY prop" 返回 Postgresql 和 SQLite 中每个组的计数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-17
    • 1970-01-01
    • 2015-09-30
    • 1970-01-01
    • 1970-01-01
    • 2019-12-10
    相关资源
    最近更新 更多