简体   繁体   English

使用Sub Select而不是INNER JOIN的实体框架

[英]Entity Framework using Sub Select not INNER JOIN

I have the below classes such as 我有以下课程,如

public class Team
{
    [Key]
    public virtual Int32 TeamId { get; set; }
    [Required]
    public virtual String Name { get; set; }
    public virtual String Description { get; set; }
    public virtual ICollection<TeamFeed> TeamFeeds { get; set; }
}

public class TeamFeed
{       
    public Int32 TeamFeedId { get; set; }
    [Required]
    public Int32 TeamId { get; set; }
    public virtual bool IsEnabled { get; set; }
    public virtual Team Team { get; set; }
}

I have LazyLoadingEnabled = false and ProxyCreationEnabled = false 我已经LazyLoadingEnabled = falseProxyCreationEnabled = false

When I do 当我做

var team = db.Teams.Where(x => x.TeamId == 1).Include(x=>x.TeamFeeds);

The SQL generated by EF looks like: EF生成的SQL如下所示:

SELECT 
[Project1].[TeamId] AS [TeamId], 
[Project1].[Name] AS [Name], 
[Project1].[Description] AS [Description], 
[Project1].[C1] AS [C1], 
[Project1].[TeamFeedId] AS [TeamFeedId], 
[Project1].[TeamId1] AS [TeamId1], 
[Project1].[IsEnabled] AS [IsEnabled], 
FROM ( SELECT 
    [Extent1].[TeamId] AS [TeamId], 
    [Extent1].[Name] AS [Name], 
    [Extent1].[Description] AS [Description],  
    [Extent2].[TeamFeedId] AS [TeamFeedId], 
    [Extent2].[TeamId] AS [TeamId1], 
    [Extent2].[IsEnabled] AS [IsEnabled],  
    CASE WHEN ([Extent2].[TeamFeedId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
    FROM  [dbo].[Teams] AS [Extent1]
    LEFT OUTER JOIN [dbo].[TeamFeeds] AS [Extent2] ON [Extent1].[TeamId] = [Extent2].[TeamId]
    WHERE 1 = [Extent1].[TeamId]
)  AS [Project1]
ORDER BY [Project1].[TeamId] ASC, [Project1].[C1] ASC

I don't understand why it hasn't used SQL that I would use and created a long winded SQL statement. 我不明白为什么它没有使用我会使用的SQL并创建了一个冗长的SQL语句。

SELECT 
* --use all just for clarity in the example
FROM TEAMS T

INNER JOIN TEAMFEEDS TF
ON T.TEAMID = TF.TEAMID

ORDER BY 
T.TEAMID

I'm new to EF so it may be I'm not be understanding something. 我是EF的新手,所以我可能不会理解某些东西。

Thanks 谢谢

First of all, your query using INNER JOIN won't return anything, when Team with TeamID = 1 has no feeds. 首先,当TeamID = 1 Team没有提要时,使用INNER JOIN的查询将不会返回任何内容。 LEFT JOIN has to be used here, and that's what EF did in ineer SELECT : 这里必须使用LEFT JOIN ,这就是EF在ineer SELECT所做的:

SELECT 
    *
    FROM  [dbo].[Teams] AS [Extent1]
    LEFT OUTER JOIN [dbo].[TeamFeeds] AS [Extent2] ON [Extent1].[TeamId] = [Extent2].[TeamId]
    WHERE 1 = [Extent1].[TeamId]

Following scary line is just to let EF know, if left site of the JOIN was specified - it returns 0 if Team has no Feeds and 1 if at lease one Feed was found. 如果指定JOIN左侧站点,那么下面的可怕线就是让EF知道 - 如果Team没有Feeds则返回0如果找到了至少一个Feed,则返回1

CASE WHEN ([Extent2].[TeamFeedId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]

And outer SELECT statement just maps DataBase columns names to EF model properties names and does ORDER BY . 外部SELECT语句只是将DataBase列名称映射到EF模型属性名称并执行ORDER BY

Hope it's enough of explenation why EF generated such a long winded SQL statement . 希望它足以解释为什么EF会产生如此冗长的SQL语句 Or rather why this statement only looks scary, but really is not much more then your simple SELECT * FROM Teams JOIN Feeds . 或者更确切地说,为什么这个陈述看起来很可怕,但实际上并不是简单的SELECT * FROM Teams JOIN Feeds

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM