首先将此SQL转换为EF 4代码的lambda

我有这个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

我想要转换成lambda表达式。

这是它的工作原理。

一个游戏只能加入1个系列,但一个系列当然可以有很多游戏。 一个系列赛可以有许多球队,一支球队可以参加很多系列赛。 一个球员可以参加很多球队,而球队有很多球员。

SeriesTeams和TeamPlayers只是EF创建的多对多表,用于保存系列/团队和团队/玩家之间的参考

提前致谢...

编辑:我使用的EF 4 CTP5,并希望有答案作为lambda函数,或在linq,如果更容易...


好的,首先,如果你想在运行查询时确保所有的东西都是急切加载的,你应该添加一个明确的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();

我确实找到了解决方案。

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();

如果有人有更好的解决方案,那么我全都是耳朵..

链接地址: http://www.djcxy.com/p/52769.html

上一篇: Convert this SQL to lambda for EF 4 Code first

下一篇: Where to put domain logic which needs to fetch data from database