NHibernate - динамический параметр QueryOver - PullRequest
1 голос
/ 18 февраля 2011

У меня есть проект MVC, для которого я пытаюсь настроить хорошее решение для пейджинга.

У меня есть несколько таблиц в SQL Server, которые содержат несколько тысяч строк, которые я бы хотел просматривать. Если у меня нет какого-либо фильтра для подкачки, он прекрасно работает. Это метод, который я использую для этого:

    public virtual PagedList<T> GetPagedData(int startIndex, int count) {
        var rowCount = session.CreateCriteria(typeof(T)).SetProjection(Projections.RowCount()).FutureValue<Int32>().Value;
        var pageOfItems = session.CreateCriteria(typeof(T)).SetFirstResult(startIndex).SetMaxResults(count).List<T>();
        return new PagedList<T>(pageOfItems, startIndex, count, rowCount);
    }

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

    public virtual PagedList<T> GetPagedData<T>(int startIndex, int count, System.Linq.Expressions.Expression<Func<T, bool>> predicate) where T : class {
        var rowCount = session.QueryOver<T>().Where(predicate).Select(Projections.RowCount()).FutureValue<Int32>().Value;

        var pageOfItems = session.QueryOver<T>().Where(predicate).Skip(startIndex).Take(count).List<T>();
        return new PagedList<T>(pageOfItems, startIndex, count, rowCount);
    }

вызов этого будет выглядеть примерно так:

* * 1010

Проблема в том, что ему не нравится выражение "Содержит". Если я сделаю точное совпадение, оно будет отлично работать (x.Name == q), но я не получу результаты, к которым стремлюсь.

Исключение, которое я вижу при использовании "Contains":

Нераспознанный вызов метода: System.String: Boolean Contains (System.String)

У кого-нибудь есть идеи, как заставить это принимать такое выражение динамически? У меня есть базовый класс репозитория, в который я поместил это, потому что я буду использовать тот же тип поведения для нескольких других таблиц. Я мог бы написать отдельный метод для каждой таблицы, но я бы предпочел сделать это динамически, если это возможно.

Спасибо за любой совет!

Ответы [ 2 ]

3 голосов
/ 18 февраля 2011

QueryOver не является LINQ, и он принимает только очень ограниченный набор выражений.

Я предлагаю переписать ваш метод для использования LINQ, заменив QueryOver на Query. Единственная проблема заключается в том, что подсчет с использованием будущего запроса сделать сложнее (см. этот ответ для подробной информации)

Вот версия без будущего:

* * 1010
0 голосов
/ 08 октября 2012

С QueryOver вы должны использовать метод расширения IsLike, поэтому x.Name.IsLike(q, MatchMode.Anywhere).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...