我使用Linq与entity-framework。
GetSet1<T>().Union(GetSet2<T>())
GetSetX返回iquerable .
生成的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...
是最好的查询。所以有一种方法(我可以(实际上没有发现)有EntityFramework使用UNION而不是UNION ALL ?
==========
1:添加<T>
以获得更高的精度
Union()
方法应该返回没有重复的结果。根据查询,EF将生成UNION ALL
和DISTINCT
或仅生成UNION
,因此没有必要显式地生成Distinct()
。与UNION ALL
对应的Linq是Concat()
。
除此之外,EF有为查询生成低效SQL的历史。如果可以的话,应该使用EF 5.0,它大大改进了查询SQL的生成。