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

Entity framework 首先将此SQL转换为EF 4代码的lambda,entity-framework,entity-framework-4.1,Entity Framework,Entity Framework 4.1,我有这个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 TeamP

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

这就是它的工作原理

一场比赛只能参加一个系列赛,但一个意甲当然可以有很多场比赛。一个意甲可以有很多球队,一个球队可以参加很多系列赛。 一个球员可以参加多个球队,一个球队有很多球员

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

先谢谢你


编辑:我使用EF 4 CTP5,并希望将答案作为lambda函数,或者在linq中,如果这更容易…

我确实找到了解决方案

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();
IList commingGames=this.Games
.Where(a=>a.StartTime>=DateTime.Now&&a.Series.Teams.Any(t=>t.Players.Any(p=>p.Id==user.Id))).ToList();

如果有人有更好的解决方案,那么我洗耳恭听。

好的,首先,如果您想确保在运行查询时加载所有内容,您应该添加一个显式的
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 gamesAndPlayersList = query.ToList();

不过,这不会给出与SQL查询相同的结果。不同之处在于,SQL查询只返回Id==1的玩家,而LINQ查询将返回玩家1的游戏列表,但同时返回与玩家1在同一团队中的所有玩家(未过滤子集合)。这是您实际需要的输出吗?此外,如果没有lazyloading,您甚至无法访问任何导航属性(只有
游戏
将从DB加载)。您使用的是什么版本的EF?是的,我看到它是EF4 CTP5-很抱歉,在发布我的评论之前,我没有重新阅读您的问题并查看编辑。顺便说一句,有没有理由不切换到EF4.1?对不起!我实际上使用的是EF4.1,EF4 CTP5必须是旧习惯:)。关于这一点,我认为球队中的所有球员都是球员1。我应该如何更改lambda表达式以仅显示玩家1的游戏?您好。我会试试看。我猜EF生成的SQL语句不如我原来的SQL语句“好”。一种方法是创建一个视图,该视图精确地从不同的表中提供我想要的信息,并执行该视图,然后创建这个特殊实体以匹配该结果。这样做可能没有上面提到的那么好,但是可以让我在数据库方面有更好的性能。我必须做一些性能测试来决定是否值得额外的工作。
var gamesAndPlayersList = query.ToList();