连接两个表实际上在SQL事件探查器中运行两个选择

时间:2017-10-09 12:45:24

标签: c# entity-framework-core

var query = from organization in _context.Organizations
                        join location in
                        (
                            from location in _context.Locations
                            orderby location.Name
                            select new
                            {
                                location.Id,
                                location.Name,
                                location.OrganizationId,
                            }

                        ) on organization.Id equals location.OrganizationId into 
        locations
                        orderby organization.Name
                        select new
                        {
                            organization.Id,
                            organization.Name,
                            locations
                        };

我正在使用Entity Framework Core 1.1。我在这里加入组织与组织LINQ中的位置表。但是当我运行上面的LINQ查询时,我在SQL事件探查器中得到了两个单独的select语句,

我明白了:

    SELECT [organization].[Id], [organization].[Name]
    FROM [Organization] AS [organization]
    ORDER BY [organization].[Name] 

    SELECT [location].[Id], [location].[Name]
    FROM [Location] AS [location] 
    ORDER BY [location].[LoName]

我的期望是在SQL事件探查器中连接两个表的单个查询。但是我缺少的是所以这在SQL中作为单个连接查询运行?

1 个答案:

答案 0 :(得分:0)

EF Core 1.x无法将复杂的LINQ查询转换为优化的TSQL查询,如EF 6.在这种情况下,EF Core仅生成用于从数据库获取数据的查询,其余操作(如group by或complex where子句)将在内存中发生。在你的情况下生成的tsql查询用于获取数据和连接,order by和projection将在内存中发生,所以如果你在那些表中有大数据或者写原始sql查询而不是linq查询时要小心。