NHibernate: Lazyload одиночное свойство - PullRequest
3 голосов
/ 06 декабря 2009

В настоящее время я переместил свой blogengine из Linq2Sql в NHIbernate.

Я застрял в следующей проблеме производительности: У меня есть одна таблица: «Сообщения», в которой есть столбцы Id, Title, PostContent, DateCreated и т. Д.

Проблема в том, что когда я создаю «Список последних сообщений», я не хочу, чтобы все PostContent.

В Linq2Sql вы можете установить отложенную загрузку для одного свойства, поэтому он не будет частью запроса SQL, пока вы на самом деле не запросите свойство.

Я попытался сделать это с помощью Fluent NHibernate, выполнив следующее:

Map(x => x.PostContent).LazyLoad();

Это не сработало. Погуглив, кажется, что NHibernate не поддерживает это, поэтому мой вопрос, как я могу это исправить?

Неужели невозможно лениво загрузить мое свойство, не перенеся содержимое в отдельную таблицу?

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

Ответы [ 3 ]

3 голосов
/ 07 декабря 2009

Вот как вы можете достичь того, что вы хотите (ленивая загрузка, но не то же самое)

var posts = NHibernateSessionManager.Session.CreateQuery("Select p.Id as Id, p.Title as Title, p.DateCreated as DateCreated from Post p")
                .SetResultTransformer(NHibernate.Transform.Transformers.AliasToBean(typeof(Post)))
                .List<Post>();

Для чего предназначен AliasToBean: делать выборки для определенных столбцов (обычно из более чем одного объекта) и возвращать строго типизированную коллекцию вместо System.Object [].

Теперь, если ваш Bean (класс) является вашим классом Post, он будет заполнять этот класс ТОЛЬКО запрошенными столбцами и ничего больше.

Хотя у вас НЕ будет коллекции управляемых объектов NHibernate. Все сообщения в возвращенных списках являются обособленными неконтролируемыми объектами.

Для выполнения таких задач, как «получение всех последних сообщений» без необходимости получения наиболее «тяжеловесных» столбцов вашей сущности без необходимости создавать другие классы для преобразования данных, приведенное выше решение является идеальным.

Проверьте это для получения дополнительной информации: NHibernate: возвращение строго типизированного списка с применением агрегатной функции

3 голосов
/ 24 июля 2010

Обновление: эта возможность теперь доступна в транке NHibernate.

См. Подробности в блоге Айенде , где образец точно сценарий, который вы описываете здесь.

0 голосов
/ 06 декабря 2009

Это невозможно, когда PostContent сопоставляется с одной и той же таблицей, потому что разница в производительности незначительна в 99% случаев. Когда вы в 1%, вы можете рассмотреть возможность использования sql handbuild вместо orm для этого случая.

Насколько я знаю, загрузка Lazy / Eager вообще невозможна с linq to sql (из коробки).

Что вы можете сделать, создать другой класс с данными, которые вы хотите выбрать, и просто выделить эти данные в новый объект.

...