2013-07-19 1 views
8

나는 테이블은 열 PersonTable를 불렀다 : PersonId, RestarauntId, Age엔티티 프레임 워크가 뷰에서 선택할 때 하위 쿼리를 만드는 이유는 무엇입니까?

내가 가지고 PersonView라는보기 :

select PersonId, 
     RestarauntId, 
     RestarauntName(RestarauntId) as `RestarauntName`, 
     Age 
FROM PersonTable 

을 내가 같은 간단한 수행 할 때 : 위의

var persons = context.PersonView.Where(x=>x.PersonId == 1) 
           .Select(x=> 
            new {x.PersonId, 
             x.RestarauntId, 
             x.RestarauntName, 
             x.Age }); 

을 1 레코드를 반환하고 MySql 쿼리가 다음과 같을 것으로 기대합니다.

SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView 
WHERE PersonId = 1 

대신, 그것은 다음 생성

SELECT 1 AS `C1`, T.PersonId, T.RestarauntId, T.RestarauntName, T.Age 
FROM 
(SELECT PersonId, RestarauntId, RestarauntName, Age 
FROM PersonView) AS T 
WHERE T.PersonId = 1 

그래서 내가 where 절에 전달할 중요하지 않습니다, 그것은 항상 하위 선택 먼저 모든 레코드를 얻을 것이다. 이것은 필자가 필요로하는 뷰에 대해 쿼리 할 때만 발생하지만, 내가 기대하는 쿼리 대신 위 쿼리를 생성하는 이유에 대해 궁금합니다. 이것이 Entity Framework 문제입니까? MySql 문제입니까?

+0

을 방문하십시오. MySQL이 동일한 계획에 대해 두 쿼리를 모두 최적화 할 수 있습니까? 아마 차이점은 런타임에 중요하지 않습니다. – usr

+2

http://stackoverflow.com/questions/12690775/why-ef-generating-a-sub-query-for-a-simle-query –

+1

도움이 될지 모르겠지만 EF는 주요 정보를 사용하지 않습니다. 뷰를 사용하여 조인 유형을 결정합니다. 테이블의 내부 조인 만 사용하고 뷰는 사용하지 않습니다. – Brannon

답변

1

MySql View는 사용 된 쿼리에서 동적 필터를 허용하지 않습니다.
이 작업을 수행하는 데 사용되는 해킹이 거의 없습니다. 그러나 설계 상으로는 mysql 뷰가 사실상 동적이지 않습니다. 뷰는 항상 제공된 실제 쿼리를 실행하고, 그 결과에서만 예제에서 언급 한 것처럼 추가 필터링을 수행 할 수 있습니다. 자세한 내용은 Here

관련 문제