Стремительная загрузка с помощью API nhibernate Criteria - PullRequest
6 голосов
/ 11 января 2012

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

Мои урезанные сущности выглядят так:

class Limit
{
    Risk {get; set;}
}

class Risk
{
   List<Company> Companies { get;set;}
}

class Company
{
  List<Address> OldAdresses {get;set;}
}

class Address
{
  string Street { get;set;}
}

Мой вызов Criteria выглядит следующим образом:

var CriterionGruppe = Expression.Eq("Account.Id", someGuid);

var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
.SetFetchMode("Risk", FetchMode.Eager)
.SetFetchMode("Risk.Companies", FetchMode.Eager)
.Add(CriterionGruppe)
.SetResultTransformer(new DistinctRootEntityResultTransformer())
.List<Limit>();

Адреса все еще загружены множеством вариантов выбора.Как я могу включить старые адреса Компании в мой запрос критериев.

Я уже прочитал запись в блоге в блоге ayende и несколько других вопросов здесь в stackoverflow.Но все равно не повезло.

Я надеюсь, что кто-то может указать мне правильное направление.

Заранее спасибо, Питер

Когда мы должны использовать готовую загрузку в NHibernate??Для чего он нужен?

NHibernate Стремление извлекать за несколько уровней

Блог Ayende

1 Ответ

8 голосов
/ 11 января 2012
var account = _transaktion.Session.Load<Account>(someGuid);
var temp = _transaktion.Session.CreateCriteria(typeof(Limit))
    .SetFetchMode("Risk", FetchMode.Eager)
    .SetFetchMode("Risk.Companies", FetchMode.Eager)
    .SetFetchMode("Company.OldAddresses", FetchMode.Eager)
    .Add(Expression.Eq("Account", account))
    .SetResultTransformer(new DistinctRootEntityResultTransformer())
    .List<Limit>();

Однако это очень неэффективно.Вы загружаете огромное количество дублирующихся данных, чтобы сделать запрос 1 sql.Лучшим подходом было бы

  1. загрузить проекцию того, что действительно необходимо
  2. использовать фьючерсы и пакетную ленивую загрузку, чтобы избежать одиночного декартового набора результатов, и выбрать n + 1.
...