Эквивалент NHIbernate DataReader? - PullRequest
       0

Эквивалент NHIbernate DataReader?

1 голос
/ 08 октября 2009

Я немного новичок в NHibernate, так что этот вопрос может быть легким. В любом случае, я заменяю проект на работе, который использует ADO.NET, который теперь будет использовать NHibernate (с LinqToNhibernate). До сих пор это работало нормально, но я столкнулся с функцией, которая должна искать по большому количеству данных (около 200 000 записей, проверять каждую запись с использованием очень специфического алгоритма (что слишком сложно для LINQ), и если соответствует критериям, которые я хочу добавить в список результатов. В ADO.NET я использовал устройство чтения данных, чтобы мне не пришлось загружать все результаты в память. Есть ли эквивалентный способ сделать это в NHibernate? загрузка будет использоваться для этого? Спасибо!

Ответы [ 2 ]

2 голосов
/ 08 октября 2009

Хорошо, насколько я помню, с ISession.CreateQuery вы можете вернуть список или перечислимый. Список загрузит их все в память (я верю). IEnumerable выдаст на сервер оператор для получения всех идентификаторов с сервера. Каждый раз, когда вы перебираете ienumerable, он проверяет кеш, а если его нет в кеше, он выполняет вызов базы данных для получения информации.

Ни один из них не является тем, что вы хотите. Вы либо используете тонну памяти, либо забиваете БД.

Мне действительно кажется, что вы пытаетесь выполнить какую-то операцию ETL. Лучше всего держать под рукой пару специализированных фрагментов кода, чтобы справиться с этой ситуацией.

Если вы настаиваете на использовании NHibernate, я бы просто просмотрел результаты в управляемых чанках и использовал сеансы без сохранения состояния здесь:

http://davybrion.com/blog/2008/10/bulk-data-operations-with-nhibernates-stateless-sessions/

1 голос
/ 08 октября 2009

Как вы, возможно, знаете, при использовании NHibernate вы должны подходить к работе с данными совершенно по-другому. У вас больше нет «сырых данных», поступающих из БД, как в ADO.NET; скорее вы работаете с ОО представлением ваших данных.

Вы не запрашиваете базу данных / таблицы в NHibernate, но вместо этого вы запрашиваете свои сущности.

Я думаю, что решение вашей проблемы можно найти в прогнозах. С помощью проекции вы можете создать свой запрос в NHibernate (используя HQL или ICriteria API).
Но перед выполнением запроса через проекцию вы указываете, какие свойства вас интересуют.
Затем NHibernate выполнит запрос, который извлекает только эти свойства. Это также означает, что на самом деле возвращаются не сущности. Это скорее DTO, которое возвращается.

Итак, вам нужно будет создать класс, который будет действовать как «DTO». Он имеет только те свойства, которые вас интересуют, и вам также нужно «импортировать» этот класс, чтобы он был известен NHibernate.

Некоторое время назад я объяснил на SO, как вы можете использовать проекции. Его можно найти здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...