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