Linq to NHibernate генерирует несколько соединений к одной таблице - PullRequest
7 голосов
/ 14 апреля 2011

Когда у меня есть ссылка на ту же таблицу в моём select, что и в предложении where, linq to Nhibernate генерирует два соединения, одно для select и одно для where. т.е.

from child in Session.Query<Child>()
where child.Parent.Name == "Bob" 
select new Info 
{ 
   ParentAge = child.Parent.Age, 
   ChildName = child.Name
};

Генерирует SQL как:

Select this_.Name,
       parent1.Age
From Child this_
     left join Parent parent1 on child.ParentId = parent1.Id,
Parent parent2

Where child.ParentId = parent2.Id and parent2.Name = 'Bob'

Я бы подумал, что должен получить SQL больше как:

Select this_.Name,
       parent1.Age
From Child this_
         inner join Parent parent1 on child.ParentId = parent1.Id
Where parent1.Name = 'Bob'

Есть ли способ структурировать запрос, чтобы получить это? Имеет ли это значение?

Ответы [ 2 ]

4 голосов
/ 31 декабря 2011

Вы можете запретить NHibernate делать это, используя прозрачный идентификатор, чтобы ваш запрос выглядел так:

from child in Session.Query<Child>()
let p = child.Parent
where p.Name == "Bob" 
select new Info { 
    ParentAge = p.Age, 
    ChildName = child.Name
};
1 голос
/ 21 апреля 2011

Вы пытались сравнить план выполнения запроса для каждого в SSMS? Если дублированное соединение удаляется в SQL Server, это не имеет значения. Я обнаружил, что это имеет место в нескольких случаях, когда я думал, что сгенерированный запрос будет очень неэффективным, но после оптимизации он в точности совпадает с запросом, который выглядит намного лучше.

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