在servicestack ormlite中分页

时间:2013-09-16 09:34:13

标签: ormlite-servicestack

我正在寻找一种在ormlite中实现分页的好方法,我找到了另一个question,它有这个代码段:

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

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

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

2 个答案:

答案 0 :(得分:29)

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

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

答案 1 :(得分:3)

如果您更喜欢使用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://stackoverflow.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

强制执行合理的限制
相关问题