Запрос NHibernate с использованием выражения> не работает - PullRequest
2 голосов
/ 13 августа 2011

У меня есть интерфейс репозитория, который определяет следующий метод:

IEnumerable<T> GetMany(Expression<Func<T, bool>> where);

Я реализовал два почти идентичных репозитория, которые реализуют этот интерфейс.Мой первый репозиторий использует Entity Framework.Он реализует описанный выше метод следующим образом:

private readonly IObjectSet<T> _objectSet;

public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
    {
        return _objectSet.Where(whereExpression);
    }

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

Мой второй репозиторий использует NHibernate и реализует метод следующим образом:

private readonly ISession _context;

public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
    {
        return _context.Query<T>().Where(whereExpression);
    }

Выше не работает, хотя.Мой запрос ничего не возвращает.Мне не кажется, что какой-либо SQL генерируется вообще, когда я использую NHibernate.Может кто-нибудь объяснить, как я могу заставить это работать с помощью NHibernate?В конечном итоге я хочу иметь возможность передать предложение where в этот репозиторий и сделать так, чтобы NHibernate перевел это в SQL.

В качестве отступления я прочел, что при реализации этого мне нужно использовать Expression>, а не просто Func.Я могу успешно заставить это работать, используя Func, но он, кажется, загружает каждую запись из базы данных и затем применяет whereExpression.Это означает, что я загружаю гораздо больше объектов, чем на самом деле хочу.Правильно ли мое понимание этого?

*** РЕДАКТИРОВАТЬ В ОРИГИНАЛЬНЫЙ ПОСТ

Это очень странно, но я только что заставил это работать, изменив выражение whereExpression.Мне было предложено, чтобы запрос возвращал все сущности, чей ID был четным числом:

var results = productRepository.GetMany(a => a.Id % 2 == 0);

Я изменил это на:

var results = productRepository.GetMany (a => a.Price> 0m);

И это сработало сразу.Похоже, это вызвано попыткой запроса идентификатора объекта.Я использую генератор идентификаторов HiLo для NHibernate.Есть идеи, почему я не могу запросить значение идентификатора?

** ДРУГОЕ РЕДАКТИРОВАНИЕ

Это также не работает:

var results = productRepository.GetMany(a => a.UnitsInStock % 2 == 0);

, но это делает:

var results = productRepository.GetMany(a => a.UnitsInStock > 400 == 0);

Единицы на складе это просто целочисленный столбец.Мне кажется, что оператор по модулю не работает с NHibernate и Linq.

1 Ответ

0 голосов
/ 13 августа 2011

Вы должны вызвать ToFuture () или ToList () для фактических данных выборки из базы данных.

private readonly ISession _context;

public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
{
    return _context.Query<T>().Where(whereExpression).ToFuture();
}

или

private readonly ISession _context;

public IEnumerable<T> GetMany(Expression<Func<T, bool>> whereExpression)
{
    return _context.Query<T>().Where(whereExpression).ToList();
}

ОБНОВЛЕНО

Согласно обновленной информации: это ограничения linq для реализации провайдера NHibernate.

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