Что дает наилучшую производительность при необходимости набора данных в соответствии со сложными критериями? Есть два варианта: создать сложный оператор ICriteria или Session.Linq, ИЛИ использовать LINQ из корневого объекта и позволить NHibernate обрабатывать отложенную загрузку.
Вариант 1 (с использованием сеанса):
var result = Session.Linq<Contractor>().Where(contractor => contractor.account == "bla@account.com)
//....
.Where(condition => condition.Orders.Any(condition))
//... more conditions
Вариант 2 (использовать корневой объект для выполнения запросов «в памяти», что может означать, что большой набор результатов будет извлечен с сервера SQL):
var contractor = Session.Linq<Contractor>().Single(c => c.Id == 1);
contractor.Orders.SelectMany(o => o.NestedCollection)
.Where(c => c.List.Any(condition))
.Where(//..... more complex filtering;
Вариант в памяти не генерирует предупреждения в NHPRof, однако вариант Session генерирует предупреждение о том, что слишком большое число соединений может привести к снижению производительности.