3

所以我有一个模型实体框架代码首先一对多做错误的查询?

public class Player 
{ 
    public int PlayerId { get; set; } 

    [Required] 
    public string Name2 { get; set; } 

    public string Cv { get; set; } 

    public int TeamId { get; set; } 
    public virtual Team Team { get; set; } 
} 



public class Team 
{ 
    public int TeamId { get; set; } 
    [Required] 
    public string Name { get; set; } 
    public string City { get; set; } 
    public DateTime Founded { get; set; } 

    public virtual IList<Player> Players { get; set; } 
} 

我的团队在DB表包含的记录,我的球员在数据库表不包含任何(空)。

当我运行此查询:

 IQueryable<Player> query = playerRepository.All.Include(p => p.Team); 

     return View((query); 

我得到这个查询在DB(通过探查):

SELECT 
[Project1].[TeamId] AS [TeamId], 
[Project1].[Name] AS [Name], 
[Project1].[City] AS [City], 
[Project1].[Founded] AS [Founded], 
[Project1].[C1] AS [C1], 
[Project1].[PlayerId] AS [PlayerId], 
[Project1].[Name2] AS [Name2], 
[Project1].[Cv] AS [Cv], 
[Project1].[TeamId1] AS [TeamId1] 
FROM ( SELECT 
      [Limit1].[TeamId] AS [TeamId], 
      [Limit1].[Name] AS [Name], 
      [Limit1].[City] AS [City], 
      [Limit1].[Founded] AS [Founded], 
      [Extent2].[PlayerId] AS [PlayerId], 
      [Extent2].[Name2] AS [Name2], 
      [Extent2].[Cv] AS [Cv], 
      [Extent2].[TeamId] AS [TeamId1], 
      CASE WHEN ([Extent2].[PlayerId] IS NULL) THEN CAST(NULL AS int) 
        ELSE 1 
      END AS [C1] 
     FROM ( SELECT TOP (10) [c].[TeamId] AS [TeamId], 
            [c].[Name] AS [Name], 
            [c].[City] AS [City], 
            [c].[Founded] AS [Founded] 
         /* HERE */  
         FROM [dbo].[Teams] AS [c] 
       ) AS [Limit1] 
     /* AND HERE */ 
     LEFT OUTER JOIN [dbo].[Players] AS [Extent2] 
     ON    [Limit1].[TeamId] = [Extent2].[TeamId] 
) AS [Project1] 
ORDER BY [Project1].[TeamId] ASC, [Project1].[C1] ASC 

其中,结果我得到一个空行显示在屏幕上。这是因为这个连接是以错误的顺序完成的......而不是加入球队的球员,我得到球队的球员......这反过来意味着即使我没有在DB的球员,我在球队的空行格。

任何人有任何想法为什么?

Vladan

+0

'TOP(10)'从哪里来?什么隐藏在你的仓库后面? – 2011-05-05 08:51:14

+0

没有逻辑......这里是方法: public IQueryable 全部 { {{return context.Players; } } – 2011-05-05 08:54:44

回答

3

你一定是做错了事,或者你在看错误的查询。我用了你的实体和您的LINQ查询:

var data = context.Players.Include(p => p.Team).ToList(); 

,我得到这个SQL查询:

SELECT 
[Extent1].[PlayerId] AS [PlayerId], 
[Extent1].[Name2] AS [Name2], 
[Extent1].[Cv] AS [Cv], 
[Extent1].[TeamId] AS [TeamId], 
[Extent2].[TeamId] AS [TeamId1], 
[Extent2].[Name] AS [Name], 
[Extent2].[City] AS [City], 
[Extent2].[Founded] AS [Founded] 
FROM [dbo].[Players] AS [Extent1] 
INNER JOIN [dbo].[Teams] AS [Extent2] ON [Extent1].[TeamId] = [Extent2].[TeamId] 

但是,如果使用此查询:

var data = context.Teams.Include(t => t.Players).Take(10).ToList(); 

我会得到完全的SQL查询。 TOP (10)和反转表查询不会没有理由地出现。

相关问题