首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >首先将此SQL转换为用于EF 4代码的lambda

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

Stack Overflow用户
提问于 2011-05-15 07:34:54
回答 2查看 1.5K关注 0票数 7

我有一条Sql语句

代码语言:javascript
复制
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和TeamPlayers只是EF创建的多对多表,用于保存系列赛/球队和球队/球员之间的引用

先谢谢你...

编辑:我使用的是EF 4 CTP5,我希望得到的答案是lambda函数,或者linq,如果这样更容易的话……

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2011-05-26 21:59:10

好的,首先,如果您想确保在运行查询时所有内容都是自动加载的,那么您应该添加一个显式的Include

代码语言:javascript
复制
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查询相同的结果,因为您不会从子集合中过滤掉玩家。

EF4.1有一些很棒的Applying filters when explicitly loading related entities特性,但我不能让它在子集上工作,所以我认为你能得到的最接近原始查询的方法是将结果投影到一个匿名对象上(或者,如果你以后需要传递这个对象,你可以为此创建一个类):

代码语言:javascript
复制
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))
                        });

然后,您可以枚举和检查结果:

代码语言:javascript
复制
var gamesAndPlayersList = query.ToList();
票数 3
EN

Stack Overflow用户

发布于 2011-05-21 03:52:45

我确实找到了解决方案。

代码语言:javascript
复制
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();

如果有人有更好的解决方案,我会洗耳恭听..

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6005472

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档