У меня есть интерфейс репозитория, который определяет следующий метод:
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.