Пейджинг в служебной программе ormlite

Я ищу хороший способ реализовать пейджинг в ormlite, и я нашел еще один question, который имеет этот фрагмент:

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

Проблема с вышеизложенным заключается в том, что он возвращает все результаты, а затем пропускает и берет на себя, что побеждает цель пейджинга.

В другой google groups post Я нашел ту же проблему, и образец в проблеме github упоминается как решение, но URL-адрес no более длительные работы. Кто-нибудь знает, как правильно страницы использовать служебную программу?

Ответ 1

Найден ответ в ormlite-тестах. По существу, мы могли бы использовать SqlExpressionVisitor Limit() следующим образом:

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

Ответ 2

Я построил обертку более высокого уровня, если вы предпочитаете работать с Page и PageSize:

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

Что обеспечит разумные пределы для Page и PageSize