2013-01-18 68 views
3

我使用Linq和entity-framework。EF:有沒有辦法強制Linq使用UNION而不是UNION ALL

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

GetSetX返回IQueryable。

生成的SQL是一個UNION ALL。但我知道聯盟是實現我的目標的好方法。其實我的解決方法是:

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

在這種情況下產生的SQL是這樣的:

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

我知道(因爲那是方式是鑫卡特)是

select Field... 
union 
select Field... 

是最好的查詢。那麼,有沒有一種方法(我可以(T居然發現)有使用的EntityFramework UNION而不是UNION ALL

==========

1:添加<T>更高精度

+0

也許這兩套已經證明是可以區分的嗎?雖然我看不出EF如何足夠聰明來解決這個問題。 – usr

回答

6

Union()方法應該返回的結果沒有重複。根據查詢,EF會產生兩種UNION ALLDISTINCT或只是UNION,讓您明確Distinct()是沒有必要的。LINQ的等效UNION ALLConcat()

除此之外,EF還有一個爲查詢生成低效SQL的歷史。如果可以的話,你應該使用EF 5.0,這大大提高了查詢SQL的產生。

+0

ty。但是我的Profiler每次都說UNION ALL。 – tschmit007

+0

@ tschmit007,它不會在同一個查詢中說'DISTINCT'? – Carvellis

+0

你是對的...它做了select ... from(select distinct ... from(select ... union all select ...))。所以最後真正的問題是如何結合所有人。 – tschmit007