Nhibernate.Linq: ограничение результатов запроса с помощью Where (выражение <Predicate <T>>) - PullRequest
5 голосов
/ 28 марта 2012

Я запрашиваю свою базу данных, используя NHibernate. Теперь мне нужно ограничить выбор данных с помощью предиката. До сих пор я узнал (разработка Google в своих лучших проявлениях), что нечто подобное возможно с помощью Expressions и NHibernate.Linq.

Вот что я попробовал:

public IList<Bestellung> GetAll(Predicate<Order> predicate)
{
    Expression<Func<Order, bool>> restriction = x => predicate(x);
    ISession session = SessionService.GetSession();
    IList<Order> bestellungen = session.Query<Order>()
                        .Where(restriction).ToList();
    return bestellungen;
}

В результате Невозможно привести объект типа 'NHibernate.Hql.Ast.HqlCast' к типу 'NHibernate.Hql.Ast.HqlBooleanExpression' . Просто быстренько проверить, где это отстой: измените первую строку тела метода на

Expression<Func<Order, bool>> restriction = x => x.Id!=1;

с потрясающим результатом, что все работает отлично.

Как мне выполнить мой предикат в выражении?

1 Ответ

6 голосов
/ 28 марта 2012

Вы не можете - , по крайней мере, не легко . NHibernate (как EF и LINQ to SQL) интерпретирует выражение и преобразует его в SQL. NHibernate просто не знает, как перевести ваш предикат в SQL.

Один из способов добиться этого - заменить Predicate<T> на Expression<Func<T, bool>>:

public IList<Bestellung> GetAll(Expression<Func<Order, bool>> restriction)
{
    ISession session = SessionService.GetSession();
    IList<Order> bestellungen = session.Query<Order>()
                        .Where(restriction).ToList();
    return bestellungen;
}

Важно:
Ваш код, который вызывает этот метод, будет выглядеть так же, как и раньше:

var orders = GetAll(x => x.Id != 1);
...