2009-08-06 2 views
6

이 질문은 question에서 계속됩니다. 어제 왜 내 Entities에서 조인 쿼리를 사용하면 복잡한 SQL이 생성되었는지 묻습니다. 덜했다 (일종의 사전 ANSI SQL 구문 등) where 절을 통해 단체 가입 반면Linq에서 Join과 "Olde Style"사전 ANSI 조인 구문을 사용하는 경우의 차이점은 무엇입니까?

 var query = from ev in genesisContext.Events 
        join pe in genesisContext.People_Event_Link 
        on ev equals pe.Event 
        where pe.P_ID == key 
        select ev; 

, 데이터베이스에서 실행 18 초 걸렸습니다 끔찍한 SQL을 생산 :이 같은 쿼리를 수행하는 것 같았다 두 번째 프로그램보다 내가 모든 것을 봤했지만 여전히 두 번째는 처음에 다른 SQL을 생성하는 이유를 이해하지 못하고 같은 결과

 var query = from pe in genesisContext.People_Event_Link 
        from ev in genesisContext.Events 
        where pe.P_ID == key && pe.Event == ev 
        select ev; 

을 생산합니다. 누군가 제게 그 차이를 설명해 주시겠습니까? 나는 키워드를 조인을 사용해야하는 경우


이 내 쿼리에 가입 사용 및 실행 18 초 걸렸습니다 때 생성 된 SQL입니다 :

SELECT 
1 AS [C1], 
[Extent1].[E_ID] AS [E_ID], 
[Extent1].[E_START_DATE] AS [E_START_DATE], 
[Extent1].[E_END_DATE] AS [E_END_DATE], 
[Extent1].[E_COMMENTS] AS [E_COMMENTS], 
[Extent1].[E_DATE_ADDED] AS [E_DATE_ADDED], 
[Extent1].[E_RECORDED_BY] AS [E_RECORDED_BY], 
[Extent1].[E_DATE_UPDATED] AS [E_DATE_UPDATED], 
[Extent1].[E_UPDATED_BY] AS [E_UPDATED_BY], 
[Extent1].[ET_ID] AS [ET_ID], 
[Extent1].[L_ID] AS [L_ID] 
FROM [dbo].[Events] AS [Extent1] 
INNER JOIN [dbo].[People_Event_Link] AS [Extent2] ON EXISTS (SELECT 
    1 AS [C1] 
    FROM (SELECT 1 AS X) AS [SingleRowTable1] 
    LEFT OUTER JOIN (SELECT 
      [Extent3].[E_ID] AS [E_ID] 
     FROM [dbo].[Events] AS [Extent3] 
     WHERE [Extent2].[E_ID] = [Extent3].[E_ID]) AS [Project1] ON 1 = 1 
    LEFT OUTER JOIN (SELECT 
     [Extent4].[E_ID] AS [E_ID] 
     FROM [dbo].[Events] AS [Extent4] 
     WHERE [Extent2].[E_ID] = [Extent4].[E_ID]) AS [Project2] ON 1 = 1 
    WHERE ([Extent1].[E_ID] = [Project1].[E_ID]) OR (([Extent1].[E_ID] IS NULL) AND ([Project2].[E_ID] IS NULL)) 
) 
WHERE [Extent2].[P_ID] = 291 

이는 SQL이다는 는 ANSI 스타일 구문을 사용하여 생산하는 (그리고 나는 SQL 자신을 쓰고 있다면 내가 쓴다 것과 비슷한입니다)되었다

SELECT * FROM Events AS E INNER JOIN People_Event_Link AS PE ON E.E_ID=PE.E_ID INNER JOIN PEOPLE AS P ON P.P_ID=PE.P_ID 
WHERE P.P_ID = 291 
+0

큰 질문입니다. – tomfanning

+0

어떤 DB를 사용하고 있습니까? SQL 코드는 어떻게 생겼습니까? – AnthonyWJones

답변

4

위의 쿼리는 모두 "정확합니다." EF에서는 일반적으로 위의 두 가지 대신 관계 속성을 사용하는 것이 옳습니다. 당신이 재산이라고 Person.PhoneNumbers에서 PHONENUMBERS 많은 관계로 하나 Person 객체가 있다면 예를 들어, 당신은 쓸 수 :

var q = from p in Context.Person 
     from pn in p.PhoneNumbers 
     select pn; 

EF의 당신을위한 가입 구축 할 것입니다.

위의 질문에서, 생성 된 SQL이 다른 이유는 표현식 트리가 서로 다른 결과를 나타 내기 때문입니다. 표현식 트리는 SQL에 매핑되며 동일한 결과를 다른 성능으로 생성하는 다른 SQL을 작성할 수 있다는 것을 물론 알고 있습니다. 이 매핑은 사용자가 "기존"EF 쿼리를 작성할 때 알맞은 SQL을 생성하도록 설계되었습니다.

하지만 맵핑이 너무 독창적 인 쿼리를 사용하고 최적화하는 것처럼 영리하지는 않습니다. 첫 번째 쿼리에서는 개체이 동일해야한다고 명시합니다. 두 번째에서는 ID 속성이 동일해야한다고 명시합니다. 위의 샘플 쿼리는 "이 레코드에 대한 세부 정보 만 얻습니다"라고 말합니다. EF는 내가 보여 주는 방식으로 작업하도록 설계되었지만 스칼라 동등성을 잘 처리합니다.

+0

마침내 제대로 작동하고 이해하려고 노력 중입니다. 감사합니다. – Calanus

관련 문제