Ответ 1
Использовать будущие запросы. Вот пример.
Я нашел 2 похожих вопроса:
В соответствии с эта страница:
Соблюдайте осторожность множественные свойства коллекции на в то же время. Хотя это утверждение будет работать нормально:
var employees = session.Query<Employee>() .Fetch(e => e.Subordinates) .Fetch(e => e.Orders).ToList();
Выполняет декартово предложение продукта против базы данных, поэтому общая сумма количество возвращенных строк будет общее количество подчиненных заказы.
Допустим, у меня есть следующая модель:
public class Person
{
public virtual int Id { get; private set; }
public virtual ICollection<Book> Books { get; set; }
public virtual ICollection<Article> Articles { get; set; }
public virtual ICollection<Address> Addresses { get; set; }
}
Каков самый простой способ охотно загружать всех людей своими книгами, статьями и адресами с помощью QueryOver/Linq (без возврата декартового произведения)?
Спасибо
Update:
Смотрите cremor ответ ниже и Флориан Лим answer в этой теме. Следующий код работает красиво, только один раунд в базу данных.
var persons = session.QueryOver<Person>()
.Future<Person>();
var persons2 = session.QueryOver<Person>()
.Fetch(x => x.Books).Eager
.Future<Person>();
var persons3 = session.QueryOver<Person>()
.Fetch(x => x.Articles).Eager
.Future<Person>();
var persons4 = session.QueryOver<Person>()
.Fetch(x => x.Addresses).Eager
.Future<Person>();
Использовать будущие запросы. Вот пример.
Я предпочитаю использовать поставщик linq, если это вообще возможно, особенно если вы используете более новые версии nhibernate ( >= 4.0). Пока у вас есть ваши коллекции, отображаемые как ISets (требуется .net framework >= 4), которые мы переделали так, чтобы мы могли загружать и избегать декартовых продуктов. Я чувствую, что это не то, что сильно рекламируется, но я предпочитаю этот метод там, где это применимо, над чем-либо еще:
public class Person
{
public virtual int Id { get; private set; }
public virtual ISet<Book> Books { get; set; }
public virtual ISet<Article> Articles { get; set; }
public virtual ISet<Address> Addresses { get; set; }
}
public Person()
{
this.Books = new HashSet<Book>();
this.Articles = new HashSet<Article>();
this.Addresses = new HashSet<Address>();
}
Если у вас есть ваши коллекции, как указано выше, вы можете сделать следующее и по-прежнему избегать проблем с продуктами:
var persons = session.Query<Person>()
.FetchMany(x => x.Books)
.FetchMany(x => x.Articles)
.FetchMany(x => x.Addresses)
.ToList();
public IList<Person> GetAll()
{
var persons = session.QueryOver<Person>()
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Books).Eager
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Articles).Eager
.Future<Person>();
session.QueryOver<Person>()
.Fetch(x => x.Addresses).Eager
.Future<Person>();
return persons.ToList();
}