Я не совсем понимаю, почему предложение Включить в этом запросе
from m in _cmsDb.Matters.Include("MatterContacts.ClientContact.Name")
where m.CLIENT_CODE == clientCode && m.MATTER_CODE == matterCode
from mc in m.MatterContacts
select mc.ClientContact;
и последующие ссылки на свойства навигации, сделанные на результирующих объектах ClientContact, не удовлетворяются одним вызовом SQL. У сущности Matter есть множество MatterContact , и каждая из этих ссылок ссылается на один ClientContact , и у этого последнего объекта есть свойство навигации, которое называется Name который ссылается на имя сущность.
При трассировке SQL я вижу, что мое предложение Include вызвало объединение до самой таблицы, содержащей сущность Name . Вот извлечение соединений, которые я вижу:
HBM_MATTER INNER JOIN [dbo].[HBA_MATTER_CONT] AS [Extent2] ON [Extent1].[MATTER_UNO] = [Extent2].[MATTER_UNO]
LEFT OUTER JOIN (... FROM [dbo].[HBA_CLIENT_CONT] AS [HBA_CLIENT_CONT]) AS [Extent3] ON [Extent2].[CONTACT_UNO] = [Extent3].[CONTACT_UNO])
FROM [dbo].[HBM_NAME] AS [HBM_NAME]) AS [Extent4] ON [Extent3].[NAME_UNO] = [Extent4].[NAME_UNO]
Итак, я вижу, что соединения происходят по всей иерархии. Однако когда я обращаюсь к свойствам сущности Name (например, .Name.FirstName), я вижу дополнительные вызовы SQL для поиска имени.
* * 1 022, например,
...
FROM (SELECT ... FROM [dbo].[HBM_NAME] AS [HBM_NAME]) AS [Extent1]
WHERE [Extent1].[NAME_UNO] = @EntityKeyValue1',N'@EntityKeyValue1 int',@EntityKeyValue1=204629
Я бы подумал, что объект «Включить» перенесет сущность «Имя» в память для возвращенных объектов ClientContact. Но след будет указывать иначе.