我使用Entity Framework Core 2.0.1。 在我的EF查询中,我需要将几个简单查询组合到单个UNION查询中。所以,对于一个非常基本的例子,我有几个类似的查询
using (var dbc = new ItemsDbContext("some-connection-string"))
{
var q1 = dbc.Items.Where(a => a.ItemType == "A");
var q2 = dbc.Items.Where(a => a.ItemType == "B");
var myList = q1.Union(q2).ToList();
}
我希望这个SQL语句作为单个查询针对我的SQL Server数据库执行:
SELECT I.*
FROM [dbo].[Items]
WHERE I.ItemType = N'A'
UNION
SELECT I.*
FROM [dbo].[Items]
WHERE I.ItemType = N'B'
但是,正如我在SQL Server Profiler中看到的那样,执行了两个单独的查询:
查询1:
SELECT I.*
FROM [dbo].[Items]
WHERE I.ItemType = N'A'
查询2:
SELECT I.*
FROM [dbo].[Items]
WHERE I.ItemType = N'B'
这两个单独查询的结果稍后由Entity Framework联合。但它是在调用代码中完成的,而不是在SQL Server的端。
如何让Entity Framework Core生成UNION而不是多个查询?
答案 0 :(得分:3)
根据this GitHub issue服务器端,UNION在EF Core 2.0.1中尚未实现。 服务器端UNION计划在EF Core v.2.1中实现,直到那时EF将执行本地联盟(在内存中)。
答案 1 :(得分:0)
我在Linqpad中试过这个
from x in
(from x in TableA select new {A = x.Code, B = x.Name})
.Concat( from y in TableB select new {A = y.Code, B = y.Name})
select x
及以下是生成SQL查询
SELECT [t2].[Code] AS [A], [t2].[Name] AS [B]
FROM (
SELECT [t0].[Code], [t0].[Name]
FROM [coa].[TableA] AS [t0]
UNION ALL
SELECT [t1].[Code], [t1].[Name]
FROM [coa].[TableB] AS [t1]
) AS [t2]