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在ineerSELECT
中所做的:
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]
而outerSELECT
语句只是将数据库列名称映射到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]