NHibernate с LINQ (предикаты?) - PullRequest
       39

NHibernate с LINQ (предикаты?)

3 голосов
/ 21 февраля 2012

Пожалуйста, прости меня, если я не совсем уверен, я только начинаю с выражений NHibernate / LINQ / Lambda, и я на самом деле не уверен, что искать ...

Я работаю с .NET 2.0 в течение последних 4 или 5 лет, и у меня не было возможности развиваться, кроме как я сам, поэтому я сейчас изучаю новые технологии:)

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

Сейчас я нахожусь в следующей ситуации:

  • MyProject.Core.dll : у меня есть эта сборка ядра, которая содержит всю бизнес-логику и устанавливает контракт IRepository. Он ничего не знает о фактической реализации хранилища, он разрешается во время выполнения с использованием IoC, поэтому эта базовая DLL не имеет ссылки на библиотеки NHibernate.
  • MyProject.Data.NHibernate.dll : реализация репозитория содержится в этой сборке, которая имеет все необходимые ссылки на библиотеки NHibernate.

Моя реализация репозитория выглядит примерно так:

public class GenericRepository<T> : IGenericRepository<T> where T : class
{
    ...
    public virtual IQueryable<T> All()
    {
        IList<T> entities = Session
            .CreateCriteria( typeof( T ) )
            .List<T>();
        return entities.AsQueryable<T>();
    }
    ...
}

Так что в моей основной dll я могу получить ссылку на мой репозиторий и сделать что-то вроде:

IList<Person> people = myRepository.All().ToList();

Кажется, это работает хорошо, он запрашивает базу данных и возвращает все строки из таблицы Person.

Однако теперь я хочу добавить предикаты:

IList<Person> daves = myRepository.All().Where(p => p.Name == "Dave").ToList();

Это работает нормально, но, конечно, происходит то, что NHibernate сначала запрашивает базу данных, чтобы вернуть ВСЕ строки, а затем LINQ фильтрует результаты, чтобы вернуть только те, чье имя "Dave".

Я искал по всему интернету, но я не нашел, как это реализовать, также я обнаружил много вещей, которые кажутся устаревшими, например, я часто видел вызовы к сеансу NH.Linq () метод, я просмотрел все мои DLL, этот метод нигде не найти ...

Если бы кто-нибудь мог указать мне правильное направление, может быть, с небольшим примером или чем-то, я был бы очень благодарен.

Большое спасибо!

Ответы [ 2 ]

7 голосов
/ 21 февраля 2012

Это довольно просто:

Использование session.Query<T>():

public virtual IQueryable<T> All()
{
    return Session.Query<T>();
}

Query<T> - это метод расширения, который находится в пространстве имен NHibernate.Linq.

session.Linq больше не поддерживается.Это был поставщик LINQ для NHibernate до версии 3 и был заменен на Query<T>.

0 голосов
/ 21 февраля 2012

Возможно, вы захотите использовать шаблон спецификации с вашим репозиторием. Вот пример реализации с NHibernate здесь из поваренной книги NHibernate 3.0, которая является отличным ресурсом, который стоит получить.

...