2017-07-14 89 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 
};