Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 为什么我的实体框架创建多个查询而不是单个联合查询?_Sql Server_Entity Framework_Ef Core 2.0 - Fatal编程技术网

Sql server 为什么我的实体框架创建多个查询而不是单个联合查询?

Sql server 为什么我的实体框架创建多个查询而不是单个联合查询?,sql-server,entity-framework,ef-core-2.0,Sql Server,Entity Framework,Ef Core 2.0,我使用实体框架核心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")

我使用实体框架核心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 Server数据库执行这样的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'
这两个独立查询的结果稍后由实体框架合并。但这是在调用代码中完成的,而不是在SQL Server方面


如何使实体框架核心生成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]
据了解,服务器端联合还没有在EF Core 2.0.1中实现。
服务器端联合计划在EF Core v中实现。2.1,在此之前,EF将执行本地联合(在内存中)。

您可以尝试类似的方法,添加where子句var query=(从db.Table1中的x选择新的{A=x.A,B=x.B})。Concat(从db.Table2中的y选择新的{A=y.A,B=y.B});尝试使用q1.Concat(q2)而不是q1.Union(q2)-相同的否定结果:两个单独的查询。q1.Concat(q2)而不是q1.Union(q2)在本例中都是相同的,AFIK,当您在q1和q2中声明变量时,它们是可查询的,当您尝试使用.Concat或.Union时,它将逐个解析,您需要尝试上面提到的整个查询,您如何在LINQPad中实现它?我在live project中尝试了它,结果仍然是一样的:单独的查询。可能不同之处在于您使用不同的表(TableA和TableB),而我只使用Items表。您是否可以使用Linq to实体而不是EF?您能否给我一个提示:您有什么不同之处?是否将一个查询包装到另一个查询中?或者是构建匿名对象有什么帮助?我尝试了不同的方法,但仍然无法在SQL中实现联合:/n生成的查询的形状更像是从LINQ到SQL。因此与OP问题没有任何共同之处。这一点在EF Core 3.0版本中被考虑。然而,英孚核心联络人似乎在暗示我们不应该抱着希望。