我可以在Linq查询中select多个对象吗?

我对Linq非常陌生,对我一无所知。 我可以在select中返回多个项目吗? 例如我有一个灯具列表(想想橄榄球(或足球的猛拉)固定装置)。 每个夹具包含一个主客场球队和主客场比分。 我想要得到所有的队伍。 我想用类似的东西

IEnumerable<Team> drew = from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) select fixture.HomeTeam && fixture.AwayTeam; 

我知道这个语法是不正确的,我不知道是否可以这样做。 我需要两个查询,然后连接它们?

编辑:这实在是一个学习的东西,所以这是没有关键的,以任何特定的方式实现这一点。 基本上,在这个阶段,我想要的是一个已经绘制的球队列表。 一个例子的用法可能是,对于给定的装置列表,我可以find所有被抽中的球队,这样我就可以在一张牌桌上以1分(3胜1负)来更新他们的排名。

干杯詹姆斯

我认为你正在寻找联盟的方法如下:

 IEnumerable<Team> drew = (from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) select fixture.HomeTeam) .Union(from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) select fixture.AwayTeam); 

101 LINQ示例 ,即select – 匿名types1

 ... select new { HomeTeam = fixture.HomeTeam, AwayTeam = fixture.AwayTeam }; 

约翰价格的解决scheme(独立)的变化…

 IEnumerable<Team> drew = from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) from team in new[]{fixture.AwayTeam, fixture.HomeTeam} select team; 

你可以考虑在Fixture类中添加“ParticipatingTeams”来获得:

 IEnumerable<Team> drew = from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) from team in fixture.ParticipatingTeams select team; 

自己刺了一下,我想出了一个“取决于”的版本。

使用查询理解语法:

 IEnumerable<Team> drew = from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) from team in new[]{fixture.AwayTeam, fixture.HomeTeam} select team; 

使用带扩展方法的lambda:

 IEnumerable<Team> drew = fixtures.Where(f => f.Played && f.HomeScore == f.AwayScore) .SelectMany(f => new[]{f.HomeTeam, f.AwayTeam}); 

编辑:我不知道一个团队是否可能在数据库中多次播放和绘制过,但是如果可能的话,那么您可能需要使用Distinct查询运算符:

 IEnumerable<Team> drew = (from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) from team in new[]{fixture.AwayTeam, fixture.HomeTeam} select team).Distinct(); 

要么:

 IEnumerable<Team> drew = fixtures.Where(f => f.Played && f.HomeScore == f.AwayScore) .SelectMany(f => new[]{f.HomeTeam, f.AwayTeam}) .Distinct(); 

或者你可以定义一个types来保存所有的数据:

 IEnumerable<TeamCluster> drew = from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) select new TeamCluster { Team1 = fixture.HomeTeam, Team2 = fixture.AwayTeam, Score1 = fixture.HomeScore, Score2 = fixture.AwayScore }; class TeamCluster { public Team Team1 { get; set; } public Team Team2 { get; set; } public int Score1 { get; set; } public int Score2 { get; set; } } 

编辑:对不起,误解了你原来的问题,所以重写了答案。

你可以使用“SelectMany”操作符来做你想做的事情:

 IEnumerable<Team> drew = (from fixture in fixtures where fixture.Played && (fixture.HomeScore == fixture.AwayScore) select new List<Team>() { HomeTeam = fixture.HomeTeam, AwayTeam = fixture.AwayTeam }).SelectMany(team => team); 

这将返回一个扁平化的队伍名单。

我碰到这个问题,找不到我想要的东西,所以我写了一个小的扩展方法,做了我想要的。

 public static IEnumerable<R> MapCombine<M, R>(this IEnumerable<M> origList, params Func<M, R>[] maps) { foreach (var item in origList) foreach (var map in maps) { yield return map(item); } } 

在问题之后,你会做这样的事情

 var drew = fixtures.Where(fixture => fixture.Played && (fixture.HomeScore == fixture.AwayScore)) .MapCombine(f => f.HomeTeam, f => f.AwayTeam); 

有趣的是intellisense对此并不满意,你不会在下拉列表中获得lamdbaexpression式,然而在'=>'之后它非常高兴。 但最主要的是编译器很高兴。