【问题标题】:Why my Entity Framework creates several queries instead of a single UNION query?为什么我的实体框架会创建多个查询而不是单个 UNION 查询?
【发布时间】:2018-04-01 11:40:16
【问题描述】:

我使用 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'

这两个单独查询的结果稍后由实体框架联合。但它是在调用代码中完成的,而不是在 SQL Server 端。

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

【问题讨论】:

  • 你能尝试这样的事情吗,添加你的 where 子句 var query = (from x in db.Table1 select new {A = x.A, B = x.B}) .Concat( from y in db.Table2选择新的 {A = y.A, B = y.B} );
  • 尝试使用 q1.Concat(q2) 而不是 q1.Union(q2) - 相同的否定结果:2 个单独的查询。
  • q1.Concat(q2) 而不是 q1.Union(q2) 在这种情况下都是相同的,AFIK,当您在 q1 和 q2 中声明变量时,它们是可查询的,当您尝试 . Concat 或 .Union,它正在逐个解析,您需要尝试使用我上面提到的整个查询

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


【解决方案1】:

根据this GitHub issue,EF Core 2.0.1 中根本没有实现服务器端 UNION。 服务器端 UNION 计划在 EF Core v. 2.1 中实现,到那时 EF 将执行本地 Union(在内存中)。

【讨论】:

  • 在 EF Core 3.0 版本中遇到了这种情况。但是,线程中的 EF Core 联络人似乎暗示我们不应该抱有希望。
【解决方案2】:

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

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]

【讨论】:

  • 你是如何在 LINQPad 中做到这一点的?我在现场项目中尝试过,结果仍然相同:单独的查询。也许区别在于您使用不同的表(TableA 和 TableB),而我只使用 Items 表。
  • 会不会是你使用 Linq to Entities 而不是 EF?
  • 你能给我一个提示:你有什么不同的地方吗?它是否将查询包装在另一个查询中?还是构建匿名对象有什么帮助?我尝试了不同的方法,但仍然无法在 SQL 中获得 UNION :/
  • 生成的查询的形状看起来更像是从 LINQ 到 SQL。因此与 OP 问题没有任何共同之处。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-01
  • 2013-10-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多