Как стремиться получить дочернюю коллекцию при объединении дочерних объектов коллекции в ассоциацию - PullRequest
1 голос
/ 11 июня 2010

Принимая следующий вымышленный макет

Dealership
  has many Cars
     has a Manufacturer

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


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

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

Мысли

1 Ответ

3 голосов
/ 11 июня 2010

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

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

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

...