2010-06-10 6 views
0

Предполагая следующий вымышленный макетКак хотят принести коллекцию детской, присоединяясь объектами сбора ребенка в ассоциацию

 
Dealership 
    has many Cars 
    has a Manufacturer 

Я хочу написать запрос, который говорит, что заставить меня дилерский с именем X, а также получить коллекцию автомобилей, но при этом используйте соединение с производителем. Я думаю, это потребует использования ICriteria. Я думаю, что-то вроде этого.

 

var dealershipQuery = Session.CreateCriteria< Dealership>("d") 
          .Add(Restrictions.InsenstiveLike("d.Name", "Foo")) 
          .CreateAlias("d.Cars", "c") 
          .SetFetchMode("d.Cars", FetchMode.Select) 
          .SetFetchMode("c.Manufacturer", FetchMode.Join) 
          .UniqueResult< Dealership>(); 
 

Но полученный результат выглядит не так, как я ожидал. Я начинаю думать, что DetachedCriteria может потребоваться где-то, но я не уверен.

Мысли?

ответ

2

Извлечение коллекций в том же запросе почти никогда не является лучшим решением.

Один из лучших подходов подробно описано в этой ссылке: http://ayende.com/Blog/archive/2010/01/16/eagerly-loading-entity-associations-efficiently-with-nhibernate.aspx

Лично мое предпочтительным решением является использование batch-size в обоих сборниках и юридических лиц, установленных на размер моей длины страницы по умолчанию. Таким образом, ваш запрос выше будет сделан с 3 дешевыми, индивидуально кэшируемыми запросами, а не дорогостоящим.

+0

Я должен был упомянуть, что мы используем старый Oracle, поэтому размер партии не работает. –

+0

Также я не пытаюсь получить две коллекции от Dealership. Я хочу, чтобы автомобили загрузили своего производителя с нетерпением. Вы отправили ссылку, связанную с несколькими коллекциями с одного корня. –

+0

'batch-size' на сущности и коллекции работает со всеми базами данных. И решение Айенде работает для любого количества коллекций; идея заключается в том, что вы получаете корневой файл (ы) в одном запросе и коллекции в другом. –