为什么我的 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(在内存中)。
我使用 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(在内存中)。