Прежде всего, вы можете выдать только один запрос к серверу БД с помощью соединения, а не инициализировать коллекцию после порядка забирается, как это:
public Model.Order Get(int id)
{
using (ISession session = NHibernateHelper.OpenSession())
{
Model.Order order = session
.CreateCriteria(typeof(Model.Order))
.Add(Restrictions.Eq("Id", id))
.SetFetchMode("OrderItems", FetchMode.Join)
.UniqueResult<Model.Order>();
return order;
}
}
другими дело в том, чтобы охотно загружать коллекцию коллекций без ущерба для производительности. Один из способов сделать это в вас сценарий таков:
var orderCriteria = DetachedCriteria.For<Order>()
.SetFetchMode("OrderLines", FetchMode.Eager)
.Add(Restrictions.Eq("Id", orderId));
var orderLinesCriteria = DetachedCriteria.For<OrderLine>()
.CreateAlias("Order", "order")
.SetFetchMode("Addresses", FetchMode.Eager)
.Add(Restrictions.Eq("order.Id", orderId));
IList list = s.CreateMultiCriteria()
.Add(orderCriteria)
.Add(orderLinesCriteria)
.List();
var order = ((IList)list[0]).Cast<Order>().First();
Это, к сожалению, еще не испытано, я могу сделать это позже. Идея состоит в том, чтобы сделать многоэлемент, который получает все необходимые сущности за один раз (возможно, это не самый эффективный db-запрос, но это, по крайней мере, только одна поездка), а затем пусть сеанс сшит фактический график из двух наборы результатов.
Немного другой вариант использования отлично работает в моем текущем проекте, но я немного не уверен, если я показал здесь, совершенно правильно. Но я вернусь на это :)
EDIT: Вышеупомянутый код изменен на то, что действительно работает и в настоящее время протестировано. Извините за переименование сущностей и коллекций. Я немного переименовал их в свой тестовый проект.
Могу ли я спросить, почему OrderItemAddress является коллекцией? – asgerhallas