Nhibernate игнорирует подвыбор, когда - PullRequest
0 голосов
/ 25 сентября 2019

У меня есть HasMany отношение, и я получаю следующий способ:

session.Query<ResearchEntity>()
public class ResearchEntityMap : ClassMap<ResearchEntity>{
   public ResearchEntityMap()
   {
     Table("research_entity");
     Id(x => x.Id).GeneratedBy.Identity().Column("id");
     HasMany(x => x.Names).Cascade.All().KeyColumns.Add("research_id").Not.LazyLoad().Fetch.Subselect();
     HasMany(x => x.Phones).Cascade.All().KeyColumns.Add("research_id").Not.LazyLoad().Fetch.Subselect();
}

У меня 2 проблемы.

  1. Я ожидаю, что выборка будет с Subselect, потому что это LazyLoad.(см. сопоставления выше).во время выполнения я вижу, что он создает два разных запроса для вывода LazyLoad и Phones.

  2. Я также вижу, что эти 2 запроса сгенерированы NHibernate без where reseach_id=?

    SELECT
        phones0_.research_id as research11_12_1_,
        phones0_.id as id1_12_1_,
        phones0_.id as id1_12_0_,
        phones0_.date_created as date2_12_0_,
        phones0_.last_updated_date as last3_12_0_,
        phones0_.deleted as deleted4_12_0_,
        phones0_.value as value5_12_0_,
        phones0_.is_primary as is6_12_0_,
        phones0_.finding_status as finding7_12_0_,
        phones0_.source as source8_12_0_,
        phones0_.created_by as created9_12_0_,
        phones0_.last_updated_by as last10_12_0_ 
    FROM
        phone_entity phones0_ 
    WHERE
        phones0_.research_id in (
            select
                this_.id 
            FROM
                research_entity this_ 
            WHERE
                1=1 
        )

Спасибо

1 Ответ

0 голосов
/ 25 сентября 2019

Это похоже на правильное поведение для выборки подвыбора.

  1. Я ожидаю, что выборка будет с Subselect, потому что это LazyLoad.(см. сопоставления выше).во время выполнения я вижу, что он создает два разных запроса для вызова LazyLoad и Phones.

Не уверен, что вы имели в виду.Но запросы выборки после выбора всегда выполняются отдельно от родительского запроса и отдельно для каждой ассоциации (всегда несколько циклов дБ).LazyLoad только контролирует, является ли этот второй запрос немедленным или имеет фактический доступ к свойству.Таким образом, ожидаются два дополнительных запроса: один для Phones и один для Names.

Я также вижу, что эти 2 запроса сгенерированы NHibernate без where reseach_id =?

Это потому, что запрос на выборку основан на вашем запросе выбора - session.Query<ResearchEntity>().Вот и весь смысл выборочной выборки.Он извлекает ассоциацию (т. Е. Phones) в одну поездку в дБ для родительских объектов, загруженных по вашему запросу.Таким образом, запрос выборки для подвыбора выглядит как where phones.reseach_id in ([select ids using conditions from parent query])

Подробнее см. spec .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...