Entity Framework Code First один-ко-многим делает неправильные запросы? - PullRequest
3 голосов
/ 05 мая 2011

Итак, у меня есть модель

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

Моя таблица «Команды» в БД содержит записи, а моя таблица «Игроки» в БД не содержит (пусто).

Когда я выполняю этот запрос:

        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

В результате я получаю одну пустую строку, отображаемую на экране.Это связано с тем, что эти объединения выполняются в неправильном порядке ... вместо того, чтобы присоединяться к командам на игроков, я получаю игроков на команды ... что, в свою очередь, означает, что, хотя у меня НЕТ игроков в БД, я получаю пустую строку всетка.

У кого-нибудь есть идеи, почему ???

Владан

1 Ответ

3 голосов
/ 06 мая 2011

Вы, должно быть, делаете что-то не так или смотрите неправильный запрос.Я использовал ваши сущности и ваш запрос 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) и обратные таблицы не будут отображаться без причины.

...