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

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

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

Я читал много блогов и сообщений и начал личный небольшой проект, в котором стараюсь максимально эффективно использовать шаблон репозитория.

Я сейчас в следующей ситуации:

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

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

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 session.Linq(), я просмотрел все мои dll, этого метода нигде нет...

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

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


person Seb    schedule 21.02.2012    source источник


Ответы (2)


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

Используйте 1_:

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

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

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

person Daniel Hilgarth    schedule 21.02.2012

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

person devdigital    schedule 21.02.2012