Подтвердить что ты не робот

Множественные выборки в linq для nhibernate

Я смотрел this

Соблюдайте осторожность множественные свойства коллекции на в то же время. Хотя это утверждение будет работать нормально:

var employees = session.Query()     .Fetch(e = > e.Subordinates)     .Fetch(e = > e.Orders).ToList();

Мне нужно получить 2 ссылки, поэтому мне нужно будет сделать что-то подобное. Есть ли лучший способ сделать это.

Я не могу сделать .ThenFetchMany(), поскольку он переходит к дочерним объектам, но те, которые я получаю на одном уровне.

4b9b3361

Ответ 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();

Спасибо, что все равно отметили это как ответ.