为什么我的 Entity Framework 创建多个查询而不是单个 UNION 查询?

Why my Entity Framework creates several queries instead of a single UNION query?

我使用 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 服务器数据库执行:

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 服务器端。

如何让 Entity Framework Core 生成 UNION 而不是多个查询?

我在 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]

根据 this GitHub issue server-side UNION 尚未在 EF Core 2.0.1 中实现。 Server-side UNION 计划在 EF Core v. 2.1 中实现,届时 EF 将执行本地 Union(在内存中)。