代码之家  ›  专栏  ›  技术社区  ›  Daniel S.

可查询<T>。EFCore中的工会行为

  •  5
  • Daniel S.  · 技术社区  · 6 年前

    为了实现与TSQL的等效性 UNION :

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

    我试着用 Queryable.Union<T> ( doc )“最终用户”的输出是相同的,但是当使用 SQL Server Profiler 我看得出来 两个查询 放在同一张桌子上。

    eg(SQL事件探查器的输出):

    使用EFCore

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

    'vs'

    查询Management Studio

    选择博客ID、Url
    来自博客
    联合(选择博客ID、Url
    来自博客)
    按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 . 使用 分组 没有 协会 ,使查询转换为

    SELECT [blog].[Url] , [blog].[BlogId] 
    FROM [Blogs] AS [blog]
    ORDER BY [Url]
    

    这是预期的行为。 为什么不是 协会 翻译是否正确?

    1 回复  |  直到 6 年前
        1
  •  7
  •   Tseng    6 年前

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

    EF Core支持实体和基元类型的联合 本地 .

    这个 重点 谎言在字里行间 本地 . 自EF Core 2.0起,许多EF Core Linq操作符(如GroupBy等)尚未转换为SQL。也就是说,任何分组操作都将在EF Core 2.0或更低版本的内存中执行。

    本文中翻译的查询是关于EF(旧的基于.NET Framework的EntityFramework 6.x)的。另外请注意,您问题中的MSDN链接是针对旧EntityFramework(高达6.x)的。EF核心通常位于文档上。微软com域。

    EF Core 2.1将改进许多缺失的翻译。看看 EF Core 2.1 Roadmap 当然在 2.1 Milestone on GitHub 详细查看改进。

    另请参见 this issue 其中包括Union/Except/Intersect/Concat Linq操作符的服务器端转换。

    其标签为“punted-for-2.1”。因此,如果时间允许,可以在EF Core 2.1发布之前的时间内完成,否则将在下一个版本中完成。