gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 08:29:43 28 4
gpt4 key购买 nike

我有这个 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 有一些漂亮的 Applying filters when explicitly loading related entities功能,但我无法让它用于子集合,所以我认为最接近原始查询的方法是将结果投影到匿名对象上(或者您可以为此创建一个类,如果您需要稍后传递此对象):
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();

关于entity-framework - 首先将此 SQL 转换为 EF 4 代码的 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6005472/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com