Почему EF генерирует этот sql при запросе ссылочного свойства - PullRequest
8 голосов
/ 28 января 2011

При использовании базы данных 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, я принял ответ, который обеспечил работу вокруг

РЕДАКТИРОВАТЬ: Открытпроблема подключения, она расположена здесь

Ответы [ 2 ]

1 голос
/ 29 января 2011

Напишите хранимую процедуру, которая принимает TVP в качестве входного параметра и позволяет EF материализовать результаты из SP:)

0 голосов
/ 28 января 2011

Похоже на ошибку в EF.

Я думаю, что проблема связана с тем, что вы проверяете поле в подстолбке.EF не видит, что все предложения OR ссылаются на одну и ту же таблицу и одно и то же поле в этой таблице.Поэтому он создает это сложное объединение.

Попробуйте переписать его, чтобы использовать CONTAINS вместо OR.

Использование contains () в LINQ to SQL

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