Ответ 1
Я пытаюсь найти решение для аналогичной проблемы.
Вы можете отфильтровывать коллекции с объекта с помощью 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 to 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);
Тьфу! Вы испытываете проблемы с персистентностью через вашу модель домена! Возможно, вы можете сделать это немного хуже, если репозиторий испускает 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 над коллекцией для вас, кажется, что вам лучше просто запрашивать ваш репозиторий книг, как это уже было предложено, даже если это не выглядит как сексуальное или оптимальное.