2013-08-21 5 views
2

subselect가있는 조회가 있으며, subselect에 추가 된 각 추가 필드는 동일한 테이블에 대한 추가 조인을 초래합니다. 나는 여기에 Where() 절을 제거하여 게시하는데 약간 줄 였지만 그 결과는 같습니다.Subselect는 선택된 각 필드에 대해 조인을 발생시킵니다.

DbContext.Customer 
    .Select(item => new 
    { 
     ID = item.Id, 
     Name = item.NameCompany, 
     BaseAddress = item.Customer_Address 
      .Select(child => new 
      { 
       Street = child.Address.Street, 
       Number = child.Address.Number, 
       PostalCode = child.Address.PostalCode, 
       City = child.Address.City 
      }) 
      .FirstOrDefault() 
    }) 
    .Select(item => new 
    { 
     item.ID, 
     item.Name, 
     item.BaseAddress.Street, 
     item.BaseAddress.Number, 
     item.BaseAddress.PostalCode, 
     item.BaseAddress.City 
    }) 
    .First(); 
SELECT TOP (1) 
[Extent1].[Id] AS [Id], 
[Extent1].[NameCompany] AS [NameCompany], 
[Element1].[Street] AS [Street], 
[Element1].[Number] AS [Number], 
[Element1].[PostalCode] AS [PostalCode], 
[Element1].[City] AS [City] 
FROM [dbo].[Customer] AS [Extent1] 
OUTER APPLY (SELECT TOP (1) 
    [Limit1].[AddressId] AS [AddressId], 
    [Extent3].[Id] AS [Id], 
    [Extent3].[Street] AS [Street], 
    [Extent4].[Id] AS [Id1], 
    [Extent4].[Number] AS [Number], 
    [Extent5].[Id] AS [Id2], 
    [Extent5].[PostalCode] AS [PostalCode], 
    [Extent6].[Id] AS [Id3], 
    [Extent6].[City] AS [City] 
    FROM  (SELECT TOP (1) 
     [Extent2].[AddressId] AS [AddressId] 
     FROM [dbo].[Customer_Address] AS [Extent2] 
     WHERE [Extent1].[Id] = [Extent2].[CustomerId]) AS [Limit1] 
    LEFT OUTER JOIN [dbo].[Address] AS [Extent3] ON [Limit1].[AddressId] = [Extent3].[Id] 
    LEFT OUTER JOIN [dbo].[Address] AS [Extent4] ON [Limit1].[AddressId] = [Extent4].[Id] 
    LEFT OUTER JOIN [dbo].[Address] AS [Extent5] ON [Limit1].[AddressId] = [Extent5].[Id] 
    LEFT OUTER JOIN [dbo].[Address] AS [Extent6] ON [Limit1].[AddressId] = [Extent6].[Id]) AS [Element1] 

나는 그것을 한 번에 가입하기 위해 내 쿼리를 변경할 수 있습니까? 아니면 아마도 EF의 버그일까요?

+0

EF는 그러한 돼지입니다. 명시 적 조인을 공식화하십시오. – usr

+0

@usr 이는 탐색 속성을 사용하지 않고 (필자의 경우) 유창한 구문을 사용하지 않는다는 것을 의미합니다. 내가'Join()'을 시도한 시간은 항상 끔찍한 것으로 끝납니다. 우아한 'Join()'을 작성하는 것이 가능한지 확실하지 않습니다. – Stijn

+0

쿼리 식을 사용하는 것이 좋습니다. 그것은 많은 고통을 사라지게합니다. – usr

답변

1

버그 인 것처럼 보입니다. EF 6의 현재 밤에는 훨씬 더 건전한 쿼리가 생성됩니다. (현재 베타, 6.0.0-beta1은 여전히이 버그를 가지고 있습니다).

SELECT TOP (1) 
    [Extent1].[Id] AS [Id], 
    [Extent1].[NameCompany] AS [NameCompany], 
    [Limit1].[Street] AS [Street], 
    [Limit1].[Number] AS [Number], 
    [Limit1].[PostalCode] AS [PostalCode], 
    [Limit1].[City] AS [City] 
    FROM [dbo].[Customer] AS [Extent1] 
    OUTER APPLY (SELECT TOP (1) 
     [Extent3].[Street] AS [Street], 
     [Extent3].[City] AS [City], 
     [Extent3].[PostalCode] AS [PostalCode], 
     [Extent3].[Number] AS [Number] 
     FROM [dbo].[Customer_Address] AS [Extent2] 
     INNER JOIN [dbo].[Address] AS [Extent3] ON [Extent2].[AddressId] = [Extent3].[Id] 
     WHERE [Extent1].[Id] = [Extent2].[CustomerId]) AS [Limit1] 
+0

EF를 사용하면 어떤 perf 결함이 버그인지, 어떤 것들이 설계되었는지 확신 할 수 없습니다. – usr

관련 문제