EFCore中的可查询<t> .Union行为

时间:2018-02-26 12:32:29

标签: asp.net-core entity-framework-core

为了达到TSQL UNION

的等价物
SELECT Blogid, Url
FROM Blogs
UNION (SELECT Blogid, Url
        FROM Blogs)
ORDER BY url

我尝试使用Queryable.Union<T>doc)和输出到&#34;最终用户&#34;是相同的,但在使用SQL Server Profiler时,我可以在同一个表格中看到两个查询

例如(SQL Profiler的输出):

使用EFCore

SELECT [b1].[BlogId], [b1].[Url]
FROM [Blogs] AS [b1]
go
SELECT [b2].[BlogId], [b2].[Url]
FROM [Blogs] AS [b2]
go

&#39; VS&#39;

在Management Studio上查询

SELECT Blogid, Url
FROM Blogs
UNION (SELECT Blogid, Url
        FROM Blogs)
ORDER BY url

根据this blog post

  

EF使用SELECT DISTINCT将Union转换为Union ALL,因此最终每个结果都是唯一的。

EF中查询的核心如下:

DbSet<Blog> set = db.Set<Blog>();
List<Tuple<string,int>> blogs = set.Union(set).OrderBy(blog => blog.Url).ToList();

请注意,Union未翻译,GroupBy也未翻译。 使用不GroupBy的{​​{1}},可以将查询翻译为

Union

这是预期的行为。 为什么没有SELECT [blog].[Url] , [blog].[BlogId] FROM [Blogs] AS [blog] ORDER BY [Url] 被正确翻译?

1 个答案:

答案 0 :(得分:4)

链接的文章描述了这种行为,你只是忽略了它。

  

EF Core支持实体和原始类型的联盟本地

EMPHASIS 位于本地字样。许多EF Core Linq运营商(如GroupBy等)从EF Core 2.0开始尚未转换为SQL。话虽这么说,任何按操作分组都将在EF Core 2.0或更低版本的内存中执行。

本文中的翻译查询是关于EF(旧的基于.NET Framework的EntityFramework 6.x)。另请注意,您问题中的MSDN链接适用于旧的EntityFramework(最高6.x)。 EF Core通常位于docs.microsoft.com域。

EF Core 2.1将改进许多缺失的翻译。请查看EF Core 2.1 Roadmap,当然还有2.1 Milestone on GitHub,以便详细了解详情。

另请参阅this issue,其中包含Union / Except / Intersect / Concat Linq运算符的服务器端转换。

标记为&#34;惩罚为2.1&#34;。因此,它可能会出现在EF Core 2.1中,如果时间允许它在EF Core 2.1发布之前的时间范围内完成,否则它将在下一个版本中。