【发布时间】: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