Коллекция сопоставленных запросов NHibernate

В моем веб-приложении ASP.NET я использую NHibernate, чтобы сохранить мои "Пользовательские" экземпляры, где у каждого из них есть "Записи" - коллекция. Это типичное отображение один-ко-многим, и оно прекрасно работает. Код соответствия для записей выглядит следующим образом:

<bag name="Entries" cascade="all-delete-orphan">
   <key column="UserID" />
   <one-to-many class="MyApp.Entities.Entry, MyApp.Entities" />
</bag>

Теперь у меня есть страница, где я хочу отобразить сетку со всеми записями вошедшего в систему пользователя. Для этого я мог бы просто привязать свойство "Записи" текущего пользователя к свойству "DataSource" грида. Это также прекрасно работает, но это также означает, что встроенная функциональность подкачки гридов (Telerik RadGrid) не влияет на производительность базы данных, потому что все записи будут загружаться каждый раз при отображении сетки.

Поэтому я мог бы применить свою пользовательскую подкачку страниц, где я выбираю только те строки, которые нужны для отображения текущей страницы сетки. Типичный запрос Linq2NHibernate выглядит так:

var query = from entry in Session.Linq<Entry>()
                    where entry.User == currentUser
                    select entry;
query.Skip(pageNum * pageSize).Take(pageSize).ToList();

Используя этот подход, мне нужно расширить свой репозиторий, хотя NHibernate уже сделал отображение между пользователем и входом...

Мой вопрос: если я использую LINQ для прямого запроса к коллекции "Записи" моего объекта "Пользователь" - означает ли это, что все записи будут загружены из базы данных, а затем отфильтрованы в памяти или будут переведены в реальный запрос к базе данных, чтобы я мог использовать этот более удобный подход для реализации подкачки?

Пример:

myGrid.DataSource = currentUser.Entries.Skip(pageNum * pageSize).Take(pageSize).ToList();

J4I: Конечно, я использую отложенную загрузку в файлах сопоставления...

Заранее спасибо!

1 ответ

Решение

LINQ в коллекции всегда будет LINQ-to-objects, так как они не реализуют IQueryable, поэтому вы будете загружать все в память.

Запрос является единственным возможным подходом в данный момент.

Другие вопросы по тегам