Entity framework 首先将此SQL转换为EF 4代码的lambda
我有这个Sql语句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
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();