Я пытался найти решение для подобной проблемы.
Вы можете отфильтровать коллекции от объекта, используя ISession.FilterCollection
. Это создает дополнительный IQuery, где вы можете рассчитывать, страница, добавлять критерии и т. Д.
Так, например (мой запрос в FilterCollection может быть немного отклонен, но вы должны понять):
ISession session = GetSession();
var shelf = session.Get<Shelf>(id);
var books = session.FilterCollection(shelf.Books, "where Name = :title").SetString("title", "The Great Gatsby").List<Book>();
Однако с этим есть проблема:
- Потребитель, выполняющий код
нужен доступ
ISession.CreateFilter, или вам нужно
создать метод на вашем
хранилище, которое принимает в собственность,
запрос и ваши аргументы запроса
(а также любой пейджинг или другое
Информация). Не самый сексуальный
вещь на планете.
- Это не тот LINQ, который вы хотели.
К сожалению, я не думаю, что есть какой-либо способ получить то, что вы хотите, из коробки с NHibernate. Вы могли бы подделать это, если бы хотели попробовать, но они, похоже, мне не понравились:
Добавьте метод или свойство, которое под обложками возвращает LINQ для NHibernate IQueryable для этой полки :
public IQueryable<Book> FindBooks() {
return Resolver.Get<ISession>().Linq<Book>().Where(b => b.Shelf == this);
}
где кто-то может потреблять это так:
var shelf = ShelfRepo.Get(id);
var books = (from book shelf.FindBooks()
where book.Title == "The Great Gatsby"
select book);
Тьфу! Вы истощаете свои постоянные потребности через модель вашего домена! Может быть, вы могли бы сделать это немного хуже, имея репозиторий Emit IQueryable, который во время выполнения на самом деле является LINQ to NHibernate:
public IQueryable<Book> FindBooks() {
return Resolver.Get<IRepository<Book>>().CreateQuery().Where(b => b.Shelf == this);
}
Все еще довольно бла.
Создайте свой собственный тип коллекции (и, возможно, реализацию IQueryable), которая обертывает приватное поле реальных книг, и сопоставьте NHibernate с этим полем . Тем не менее, это может быть трудным делом заставить работать с ISession.CreateFilter. Вы должны рассмотреть "обнаружение" текущего сеанса, преобразование выражения LINQ в то, что вы можете использовать в CreateFilter и т. Д. Кроме того, ваша бизнес-логика по-прежнему зависит от NHibernate.
Ничего действительно не удовлетворяет на данный момент. До тех пор, пока NHibernate не сможет сделать LINQ поверх коллекции, кажется, что вам лучше просто запросить хранилище книг в обычном порядке, как это уже предлагалось, даже если это не выглядит сексуально или оптимально.