2017-07-14 80 views
-1

比方说,我有:LINQ列表<A>选择很多<A,B>

List<string> sqlServerNames; 

和方法:

List<string> GetDatabases(string serverName); 

而且我希望有一个单一查询来获取列表{服务器名,的databaseName}

有没有办法与Linq做到这一点?因此,例如,如果我有两个服务器,“。”和“SQL2016”,那么这个服务器就是“SQL2016”。

And "." has "db1", "db2" 
And "SQL2016" has "db3" 

我会想:

".", "db1" 
".", "db2" 
"SQL2016", "db3" 
与匿名类型

可能。

+0

你想获得对'{服务器,数据库}'或'对{数据库服务器,列表}'? –

+0

第一个。 {服务器,数据库} – Derek

回答

3

只是尝试一些看起来是这样的:

var tuples = sqlServerNames.SelectMany(server => GetDatabases(server).Select(db => Tuple.Create(server, db))).ToList() 
2

您可以使用SelectMany方法:

sqlServerNames 
    .SelectMany(sn => GetDatabases(sn) 
         .Select(dbn => new { 
              ServerName = sn, 
              DatabaseName = dbn 
              } 
           ) 
       ); 
+1

我也赞成你,有人在这个问题上压倒一切。我比这个元组更喜欢这个元素,但这个元组是第一个,它基本上回答了我的问题。 – Derek

+0

匿名类型比元组看起来更漂亮,所以我upvoted。 –

+0

@Derek;但新的元组语法更加清晰(恕我直言):'.Select(dbn =>(sn,dbn))' –

3

推荐使用的SelectMany另一个重载。其他答案将需要为每个服务器名称分配一个新的枚举/枚举器/委托,但事实并非如此。

sqlServerNames.SelectMany(serverName => GetDatabases(serverName), 
          (serverName, databaseName) => new 
          { 
           ServerName = serverName, 
           DatabaseName = databaseName 
          }); 

等同于:

from serverName in sqlServerNames 
from databaseName in GetDatabases(serverName) 
select new 
{ 
    ServerName = serverName, 
    DatabaseName = databaseName 
};