为了达到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
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]
被正确翻译?
答案 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发布之前的时间范围内完成,否则它将在下一个版本中。