Ответ 1
Ну, запрос все равно вернет результаты, которые вы хотите, но, как указано, он вернет декартово произведение, то есть SQL-запрос вернет результаты count(e.Subordinates) * count(e.Orders)
, которые могут складываться довольно быстро, особенно если у вас больше, чем всего две коллекции.
NHibernate представил Futures с выпуском 2.1. К сожалению, в текущем выпуске NHibernate 3.0, похоже, нет способа заставить их работать с NHibernate.Linq(session.Query<T>()
).
Фьючерсы позволяют выполнять несколько запросов в одном обращении к базе данных (при условии, что БД поддерживает его, но большинство из них). В этом случае вы получите только count(e.Subordinates) + count(e.Orders)
результаты, что, очевидно, является минимальным.
Фьючерсы работают с API критериев, HQL, и они должны работать с новым API QueryOver (я еще не тестировал это).
NHibernate.Linq имеет Query(). ToFuture() и Query(). ToFutureValue(), но до сих пор я получаю только Исключения, когда я их использую.
Edit:
Я только что снова проверил API Linq, и кажется, что он работает, если вы не используете Fetch. Ниже приводятся три SQL-запроса, которые выполняются в одном обратном направлении. Общее количество возвращаемых строк будет равно 1 + count (Subordinates) + count (Orders).
int id = 1;
// get the Employee with the id defined above
var employee = repo.Session.Query<Employee>()
.Where(o => o.Id == id)
.ToFuture<Employee>();
// get the Subordinates (these are other employees?)
var subordinates = repo.Session.Query<Employee>()
.Where(o => o.HeadEmployee.Id == id)
.ToFuture<Employee>();
// get the Orders for the employee
var orders = repo.Session.Query<Order>()
.Where(o => o.Employee.Id == id)
.ToFuture<Order>();
// execute all three queries in one roundtrip
var list = employee.ToList();
// get the first (and only) Employee in the list, NHibernate will have populated the Subordinates and Orders
Employee empl = list.FirstOrDefault();
Спасибо, что все равно отметили это как ответ.