Загружаются ли списки NHibernate по требованию? - PullRequest
1 голос
/ 19 марта 2010

Это довольно простой вопрос. Когда я делаю это:

session.CreateCriteria(typeof(Product)).List();

Полученный IList будет загружаться при доступе к нему? Допустим, от 100 до 100 элементов например? Или он загрузит все сразу?

В случае, если это не "виртуальный", как я могу сделать это так? Какая самая лучшая практика?

Спасибо;

Ответы [ 3 ]

2 голосов
/ 19 марта 2010

Когда вы вызываете метод List(), запрос будет выполнен (и загружен сразу). Если он будет загружать сущности при доступе к ним, это вызовет некоторые потенциальные запросы «Выбрать N + 1», которые могут сильно замедлить работу вашего приложения, и вы можете не заметить его до его запуска.

Я бы сказал, что в большинстве случаев вы хотите, чтобы запрос выполнялся при вызове метода List(), и вместо этого указываете строки, которые вы хотите в запросе. Однако вы можете использовать linq to nhibernate и работать с интерфейсом IQueryable, чтобы ограничить набор результатов на более позднем этапе.

Суть в том, что может показаться очень хорошей идеей загружать сущности при доступе к ним. Но во многих случаях это вызовет некоторые серьезные проблемы (например, запросы Select N + 1), которые могут убить ваше приложение.

Очень хорошим инструментом для профилирования nhibernate является nhprof . Если вы еще не проверили это, я действительно рекомендовал бы это.

1 голос
/ 21 марта 2010

со списком все сразу С Future все сразу, только с одной обратной связью вместе с другими запросами, где вы использовали Future. С Enumerable все сразу, но создает экземпляры сущностей во время итерации.

1 голос
/ 20 марта 2010

NHibernate имеет функцию под названием Futures, которая задержит выполнение запроса на потом. Например:

class MyDao
  public IEnumerable<Product> GetProducts()
    return session.CreateCriteria(typeof(Product)).Future<Product>;


var list = MyDao.GetProducts(); // this has not be executed yet
... // some other code here
// query has not been executed yet

foreach (var o in list) // this will cause the query to be executed via IEnumerable
  Console.WriteLine(o.Name);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...