Сначала преобразуйте этот SQL в лямбда-код для EF 4 - PullRequest
7 голосов
/ 15 мая 2011

У меня есть это заявление Sql

SELECT * FROM Game 
        INNER JOIN Series ON Series.Id = Game.SeriesId 
        INNER JOIN SeriesTeams ON SeriesTeams.SeriesId = Series.Id 
        INNER JOIN Team ON Team.Id = SeriesTeams.TeamId 
        INNER JOIN TeamPlayers ON TeamPlayers.TeamId = Team.Id 
        INNER JOIN Player ON Player.Id = TeamPlayers.PlayerId 
    WHERE AND Game.StartTime >= GETDATE() 
        AND Player.Id = 1

То, что я хочу преобразовать в лямбда-выражение.

Вот как это работает.

Игра может быть присоединена только к 1 серии, но в серии может быть много игр. В серии может быть много команд, а команда может присоединиться ко многим сериям. Игрок может играть во многих командах, а в команде много игроков.

SeriesTeams и TeamPlayers - это только таблицы «многие ко многим», созданные EF для хранения ссылок между сериями / командами и командами / игроками

Заранее спасибо ...

Редактировать: я использую EF 4 CTP5 и хотел бы получить ответ в виде лямбда-функции или в linq, если это проще ...

Ответы [ 2 ]

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

Хорошо, во-первых, если вы хотите убедиться, что все загружается с нетерпением при выполнении запроса, вы должны добавить явное Include:

context.
Games.
Include(g => g.Series.Teams.Select(t => t.Players)).
Where(g => 
         g.StartTime >= DateTime.Now && 
         g.Series.Teams.Any(t => t.Players.Any(p => p.Id == 1))).
ToList();

Однако, как я уже упоминал в своем комментарии, это не даст те же результаты, что и ваш SQL-запрос, так как вы не отфильтруете проигрыватели из дочерней коллекции.

EF 4.1 имеет некоторые изящные Применение фильтров при явной загрузке связанных сущностей функций, но я не смог заставить его работать для вложенных коллекций, поэтому я думаю, что ближе всего вы можете добраться до своего оригинала запрос будет сделан путем проецирования результатов на анонимный объект (или вы можете создать класс для этого, если вам понадобится передать этот объект позже):

var query = context.
            Games.
            Where(g =>
                     g.StartTime >= DateTime.Now && 
                     g.Series.Teams.Any(t => t.Players.Any(p => p.Id == 1))).
            Select(g => new
                        {
                            Game = g,
                            Players = g.
                                      Series.
                                      Teams.
                                      SelectMany(t => t.
                                                      Players.
                                                      Where(p => p.Id == user.Id))
                        });

Затем вы можете перечислить и проверить результаты:

var gamesAndPlayersList = query.ToList();
1 голос
/ 20 мая 2011

Я нашел решение.

IList<Domain.Model.Games> commingGames = this.Games
 .Where(a => a.StartTime >= DateTime.Now && a.Series.Teams.Any(t => t.Players.Any(p => p.Id == user.Id))).ToList();

Если у кого-то есть лучшее решение, тогда я весь в ушах ..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...