为什么我的实体框架创建了多个查询而不是单个UNION查询?

时间:2018-04-01 11:40:16

标签: sql-server entity-framework ef-core-2.0

我使用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而不是多个查询?

2 个答案:

答案 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]