我一直在搜索Select和SelectMany之间的区别,但我还没有找到合适的答案。我需要学习使用LINQ to SQL时的差异,但我所找到的都是标准数组示例。

有人能提供一个LINQ到SQL的例子吗?


当前回答

select操作符用于从集合中选择值,SelectMany操作符用于从集合的集合(即嵌套集合)中选择值。

其他回答

SelectMany有几个重载。其中之一允许您在遍历层次结构时跟踪父节点和子节点之间的任何关系。

示例:假设您有以下结构:League -> Teams -> Player。

您可以很容易地返回一个平坦的播放器集合。但是你可能会失去任何关于玩家所在团队的信息。

幸运的是,有一个重载用于此目的:

var teamsAndTheirLeagues = 
         from helper in leagues.SelectMany
               ( l => l.Teams
                 , ( league, team ) => new { league, team } )
                      where helper.team.Players.Count > 2 
                           && helper.league.Teams.Count < 10
                           select new 
                                  { LeagueID = helper.league.ID
                                    , Team = helper.team 
                                   };

前面的例子来自Dan的IK博客。我强烈建议你看一看。

var players = db.SoccerTeams.Where(c => c.Country == "Spain")
                            .SelectMany(c => c.players);

foreach(var player in players)
{
    Console.WriteLine(player.LastName);
}

De Gea 阿尔芭 科斯塔 别墅 Busquets

...

select操作符用于从集合中选择值,SelectMany操作符用于从集合的集合(即嵌套集合)中选择值。

只是为了另一种观点,可能会帮助一些函数式程序员:

选择是映射 SelectMany是绑定的(或flatMap的Scala/Kotlin人)

我认为这是理解的最好方式。

            var query =
            Enumerable
                .Range(1, 10)
                .SelectMany(ints => Enumerable.Range(1, 10), (a, b) => $"{a} * {b} = {a * b}")
                .ToArray();

        Console.WriteLine(string.Join(Environment.NewLine, query));

        Console.Read();

乘法表的例子。