Простой запрос Linq дублировал соединение с одной и той же таблицей? - PullRequest
7 голосов
/ 18 декабря 2010

(Из примера в новой книге Entity Framework Джулии Лерман.) У меня есть база данных с двумя таблицами, Contact и Address. Таблица контактов имеет ContactID (int), а также имя, фамилию и т. Д. В таблице Address есть ContactID, а также город, штат, почтовый индекс и т. Д.

Вот простой запрос LINQ:

var addressGraphQuery = from a in context.Addresses.Include("Contact")
                        orderby a.Contact.LastName, a.Contact.FirstName
                        select a;

Из SQL Profiler я вижу следующее:

SELECT 
    [Extent1].[addressID] AS [addressID], 
    [Extent1].[City] AS [City], 
    [Extent1].[StateProvince] AS [StateProvince], 
    -- etc
    [Extent3].[ContactID] AS [ContactID1], 
    [Extent3].[FirstName] AS [FirstName], 
    [Extent3].[LastName] AS [LastName], 
    -- etc
FROM   [dbo].[Address] AS [Extent1]
INNER JOIN [dbo].[Contact] AS [Extent2] ON [Extent1].[ContactID] = [Extent2].[ContactID]
LEFT OUTER JOIN [dbo].[Contact] AS [Extent3] ON [Extent1].[ContactID] = [Extent3].[ContactID]
ORDER BY [Extent2].[LastName] ASC, [Extent3].[FirstName] ASC

Соединяется с таблицей контактов дважды! Зачем? Есть ли простой способ предотвратить это?


Тайна углубляется. Соединения исчезают, когда я убираю заказы. Соединения не исчезают, когда я устанавливаю context.ContextOptions.LazyLoadingEnabled = false.

Здесь также есть похожий вопрос:

Слишком много левых внешних соединений в Entity Framework 4?

Я посмотрю, есть ли Высшая сила, которую я могу спросить ...

Ответы [ 3 ]

8 голосов
/ 31 декабря 2010

Спасибо за сообщение об этой проблеме.Да, не ожидается увидеть оба соединения.Это ошибка, которая была исправлена ​​в текущих (еще не выпущенных) битах.В текущих битах тот же запрос выдает:

SELECT
[Extent1].[Id] AS [Id],
[Extent1].[Name] AS [Name],
[Extent1].[ContactId] AS [ContactId],
...
[Extent2].[Id] AS [Id1],
..
[Extent2].[FirstName] AS [FirstName],
[Extent2].[LastName] AS [LastName]
FROM  [dbo].[Address] AS [Extent1]
INNER JOIN [dbo].[Contact] AS [Extent2] ON [Extent1].[ContactId] = [Extent2].[Id] ORDER BY [Extent2].[LastName] ASC, [Extent2].[FirstName] ASC

Бит игры показывает, что даже на 4.0 это происходит только тогда, когда отношение равно 1: много, 0..1: многие, кажется, хорошо.

Спасибо,

Кати Айсва
Разработчик Entity Framework
Microsoft

1 голос
/ 31 декабря 2010

Гоббс, я не знаю, почему вы получаете как внутреннее, так и внешнее соединение.Включить делает странные вещи для запросов.Я поставил ваш вопрос перед командой, чтобы узнать, ожидается ли это (как бы плохо это ни было) и есть ли способ облегчить его.Рассматриваемый запрос является лишь примером, демонстрирующим, что вы можете использовать свойства запроса ссылки на сущность в запросе, если получаете привязку.

0 голосов
/ 18 декабря 2010

Я склонен использовать лямбда-синтаксис, поэтому я могу ошибаться, но я думаю, вы обнаружите, что хотите, чтобы ваша вторая часть предложения по порядку фактически была "затем по".1003 *

var query = context.Addresses.Include("Contact")
                   .OrderBy(a => a.Contact.LastName)
                   .ThenBy(a => a.Contact.FirstName)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...