C# 使用子选择非内部联接的实体框架

C# 使用子选择非内部联接的实体框架,c#,.net,sql,entity-framework,entity-framework-4,C#,.net,Sql,Entity Framework,Entity Framework 4,我有以下课程,如 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> TeamFe

我有以下课程,如

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; }
}
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
我不明白为什么它没有使用我会使用的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
我是EF的新手,所以我可能不了解一些东西


谢谢

首先,当
TeamID=1
的团队没有提要时,使用
内部联接的查询将不会返回任何内容<这里必须使用code>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]
下面这行可怕的代码只是为了让EF知道,若指定了
JOIN
的左侧站点,若团队并没有提要,则返回
0
,若至少找到一个提要,则返回
1

CASE WHEN ([Extent2].[TeamFeedId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]
而outer
SELECT
语句只是将数据库列名称映射到EF模型属性名称,并按排序


希望这足以解释为什么EF生成了如此冗长的SQL语句。或者更确切地说,为什么这句话看起来很吓人,但实际上并不比简单的
SELECT*fromteams-JOIN-feed

实体框架创建的查询更详细,但它们的性能通常与较短的查询一样好(有时甚至更好)。当然,EF通常比较保守,生成的代码处理您可能不关心的边缘情况。另外,EF做你要求它做的事情,而不一定是你想让它做的事情,所以有时候它会创建糟糕的代码,因为它正试图做你让它做的事情,但如果不这样做,它就不能。
CASE WHEN ([Extent2].[TeamFeedId] IS NULL) THEN CAST(NULL AS int) ELSE 1 END AS [C1]