Пожалуйста, простите меня, если я несколько неясен, я только начинаю работать с выражениями 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, этого метода нигде нет...
Если бы кто-нибудь мог указать мне правильное направление, может быть, с небольшим примером или чем-то еще, я был бы очень благодарен.
Большое спасибо!