При использовании базы данных AdventureWorks и выдаче этого запроса:
AdventureWorksEntities entities = new AdventureWorksEntities();
entities.Contacts.Where(x => x.FirstName == "A"
|| x.FirstName == "B"
|| x.FirstName == "C")
.ToList();
Будет переведен в этот sql, что лучше всего:
//ommited for brevity
FROM [Person].[Contact] AS [Extent1]
WHERE [Extent1].[FirstName] IN (N'A',N'B',N'C')
Однако, когда я выпускаю этоquery:
entities.Employee.Where(x => x.Contact.FirstName == "A"
|| x.Contact.FirstName == "B"
|| x.Contact.FirstName == "C")
.ToList();
Я получаю этот SQL:
//ommited for brevity
FROM [HumanResources].[Employee] AS [Extent1]
INNER JOIN [Person].[Contact] AS [Extent2] ON [Extent1].[ContactID] = [Extent2].[ContactID]
LEFT OUTER JOIN [Person].[Contact] AS [Extent3] ON [Extent1].[ContactID] = [Extent3].[ContactID]
WHERE [Extent2].[FirstName] = N'A' OR [Extent3].[FirstName] IN (N'B',N'C')
Почему я получаю внутреннее и внешнее соединение, и EF разделяет где и где они оба?
Примечание Использование с использованием содержит создает тот же SQL:
var names = new List<string>{"A", "B", "C"};
entities.Employee.Where(x => names.Contains(x.Contact.FirstName)).ToList();
РЕДАКТИРОВАТЬ: Таким образом, это похоже на ошибку EF, я принял ответ, который обеспечил работу вокруг
РЕДАКТИРОВАТЬ: Открытпроблема подключения, она расположена здесь