Это просто природа сгенерированного SQL Entity Framework.
ВНУТРЕННЕЕ СОЕДИНЕНИЕ существует из-за вашего оператора where
.
where codes.CountryCodeType.CountryCodeTypeName == countryCodeType
Единственный способ, с помощью которого EF может решить эту проблему, - это выполнить ВНУТРЕННЕЕ СОЕДИНЕНИЕ, как вы правильно указали. Вы также правильно заметили, что ВНУТРЕННЕЕ СОЕДИНЕНИЕ действительно возвращает все данные, необходимые для удовлетворения Include()
.
Однако OUTER JOIN все еще выполняется, просто потому что EF видит Include()
и анализирует его как требующее объединения. Рассмотрим случай, когда у вас нет предложения where
- тогда вам понадобится OUTER JOIN, верно? Ну, EF недостаточно умен, чтобы определить, что в этом случае OUTER JOIN не требуется; он видит Include()
и затем генерирует соответствующее ВНЕШНЕЕ СОЕДИНЕНИЕ, чтобы гарантировать, что требования к данным будут удовлетворены. Другими словами, он не учитывает остальную часть вашего запроса, чтобы определить, требуется ли объединение - он просто делает это независимо.
Что касается оператора Include()
, вы можете использовать его только тогда, когда хотите извлечь эти связанные объекты обратно в ваше приложение. Это не требуется для этого запроса. Самый простой запрос в этом случае будет
var query = from codes in base.context.CountryCodes
where codes.CountryCodeType.CountryCodeTypeName == countryCodeType
select codes;