2013-01-18 1 views
3

저는 Linq를 entity-framework와 함께 사용합니다.EF : Linq가 UNION ALL 대신 UNION을 사용하도록 강제하는 방법이 있습니까

GetSet1<T>().Union(GetSet2<T>()) 

GetSetX는 IQueryable을 반환합니다.

생성 된 SQL은 UNION ALL입니다. 그러나 UNION이 내 목표를 달성하는 좋은 방법이라는 것을 알고 있습니다. 사실 내 해결 방법은 다음과 같습니다

select Field... 
union 
select Field... 

이입니다

select distinct Field... 
from (
    select distinct Field... 
    union all 
    select distinct Field... 
) unionall 

나는 (그 때문에 방법은 thinked 된 경우) 알고

것을 :

GetSet1<T>().Union(GetSet2<T>()).Distinct() 

이 경우 생성 된 SQL과 같은 것입니다 최고의 쿼리. 그래서 UNION ALL을 EntityFramework 사용 UNION이 아니라 할 수있는 방법이 (내가 (t 실제로 찾을 수 있습니다) 거기에

==========

1 : 더 정밀

<T> 추가
+0

두 세트가 이미 분명히 구분되어있을 수 있습니까? 비록 EF가 그것을 이해할만큼 충분히 똑똑 할 지 모르지만. – usr

답변

6

Union() 방법은 중복하지 않고 결과를 반환해야합니다. 쿼리에 따라, EF는 명시 적 Distinct()이 필요하지 않도록하거나 DISTINCTUNION ALL하거나 UNION가. UNION ALL의 Linq에 해당하는이 Concat()입니다 생성합니다.

게다가 EF는 쿼리에 대해 비효율적 인 SQL을 생성 한 경험이 있습니다. 가능한 경우 쿼리 SQL 생성 기능이 크게 향상된 EF 5.0을 사용해야합니다.

+0

ty. 그러나 Profiler는 매번 UNION ALL이라고 말합니다. – tschmit007

+0

@ tschmit007 그리고 같은 쿼리에서'DISTINCT'를 말하지 않습니까? – Carvellis

+0

you'r right ... 선택 (... 선택 (... 선택 ... 조합 선택 ...))에서 선택 ...을 수행합니다. 그래서 마침내 진정한 질문은 모든 것을 결합하는 것입니다. – tschmit007

관련 문제