entity-framework - Entity Framework Code First 一对多查询错误?

标签 entity-framework linq-to-entities ef-code-first code-first entity-framework-4.1

所以我有一个模型

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; }
}

我在数据库中的 Teams 表包含记录,我在数据库中的 Players 表不包含任何(空)。

当我运行这个查询时:

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

        return View((query);

我在数据库中得到这个查询(通过分析器):

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

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

有人知道为什么吗???

弗拉丹

最佳答案

您一定是做错了什么,或者您正在查看错误的查询。我使用了您的实体和您的 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)和反向查表不会无缘无故出现。

关于entity-framework - Entity Framework Code First 一对多查询错误?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5894881/

相关文章:

c# - 我可以让这个 Linq to EF 更有效率吗?

c# - Entity Framework 6.0 代码优先 - 按主键过滤时在简单查询中获取重复项

c# - 在单个语句中为多个列设置默认值

entity-framework - Entity Framework 代码首先 : update SetInitializer throws exception

c# - 选中复选框时 ASP.NET MVC 更改数据库值

c# - SQL Select 数据变化时

c# - 无法在 Entity Framework 中使用 SQL 查询获取数据

c# - 将 IQueryable 列表转换为通用列表?

c# - LINQ Max() 函数执行速度超慢

.net - EF Code First 和大型模型的性能