2013-01-18 35 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