Коллекция сопоставленных запросов NHibernate - PullRequest
1 голос
/ 28 августа 2010

В моем веб-приложении 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 Ответ

0 голосов
/ 29 августа 2010

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

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

...