servicestack ormlite 中的分页

Posted

技术标签:

【中文标题】servicestack ormlite 中的分页【英文标题】:Paging in servicestack ormlite 【发布时间】:2013-09-20 09:48:05 【问题描述】:

我正在寻找一种在 ormlite 中实现分页的好方法,我发现了另一个 question,它有这个 sn-p:

var data = db.Select<address>(predicate).Skip((int) pageNumber).Take((int) pageSize).ToList();

上面的问题是它取回所有结果,然后跳过并接受它,这违背了分页的目的。

在另一个 google groups post 我发现了同样的问题,并且提到了 github 问题中的示例作为解决方案,但 URL 不再有效。有谁知道如何使用 servicestack 正确分页?

【问题讨论】:

【参考方案1】:

在 ormlite 的测试中找到了答案。本质上我们可以像这样使用 SqlExpressionVisitor 的 Limit():

var result = db.Select<K>( q => q.Where(predicate).Limit(skip:5, rows:10 ) );

【讨论】:

【参考方案2】:

如果您更喜欢使用 PagePageSize,我构建了一个更高级别的包装器:

public static class PagingExtensions

    public static SqlExpression<T> Page<T>(this SqlExpression<T> exp, int? page, int? pageSize)
    
        if (!page.HasValue || !pageSize.HasValue)
            return exp;

        if (page <= 0) throw new ArgumentOutOfRangeException("page", "Page must be a number greater than 0.");
        if (pageSize <= 0) throw new ArgumentOutOfRangeException("pageSize", "PageSize must be a number greater than 0.");

        int skip = (page.Value - 1) * pageSize.Value;
        int take = pageSize.Value;

        return exp.Limit(skip, take);
    

    // http://***.com/a/3176628/508681
    public static int? LimitToRange(this int? value, int? inclusiveMinimum, int? inclusiveMaximum)
    
        if (!value.HasValue) return null;
        if (inclusiveMinimum.HasValue && value < inclusiveMinimum)  return inclusiveMinimum; 
        if (inclusiveMaximum.HasValue && value > inclusiveMaximum)  return inclusiveMaximum; 
        return value;
    

然后您可以将查询编写为:

var results = Db.Select<K>(predicate.Page(request.Page, request.PageSize));

或者,使用额外的辅助方法将 Page 和 PageSize 保持在合理和(可能)性能值:

var results = Db.Select<K>(predicate.Page(request.Page.LimitTo(1,null) ?? 1, request.PageSize.LimitTo(1,100) ?? 100);

这将对PagePageSize 实施合理限制

【讨论】:

以上是关于servicestack ormlite 中的分页的主要内容,如果未能解决你的问题,请参考以下文章

使用 ServiceStack.ORMLite 的存储库模式中的事务

有人对 ServiceStack Ormlite 中的 postgres jsonb 有问题吗?

ServiceStack.OrmLite 入门

软删除使用servicestack.ormlite问题,怎么解决

具有多个数据库服务器的 ServiceStack OrmLite

ServiceStack Webhook + ServiceStack.Webhooks.OrmLite 订阅商店插件问题