2011-11-17 39 views
2

我有以下linq聲明,它很好用,當列表中的每個gameServer都有一個connectedClients的集合。如果其中一個屬性爲NULL,則此LINQ語句崩潰。我怎樣才能解決這個問題?

但是當connectedClientnull時,查詢崩潰。

我該如何防止這種崩潰?

var connectedClients = (from x in gameServers 
         from y in x.ConnectedClients 
         select new 
         { 
          x.Name, 
          x.GameType, 
          ConnectedClients = new 
          { 
           y.ClientName, 
           y.ConnectedOn, 
           y.ClientIpAddressAndPort 
          } 
         }).ToList(); 

和..

public class GameServer 
{ 
    public int Id; 
    public ICollection<Client> ConnectedClients; 
    ... 
} 
+2

'where y!= null'?這似乎太容易了,我一定錯誤地理解了你的問題。 – jv42

+0

我沒有看到一個名爲'connectedClient'的變量。我錯過了什麼嗎? – Polynomial

+1

就個人而言,我會改變你的代碼,當沒有連接的客戶端時,'ConnectedClients'是**空**而不是'null'(見例如[this](http://stackoverflow.com/questions/1969993/is-它更好地返回null或空集合))。 – AakashM

回答

7

前第二次檢查空,如果爲空,則使用的值不爲空,而不是:

var connectedClients = (
    from x in gameServers 
    from y in x.ConnectedClients ?? Enumerable.Empty<Client>() 
    // ... 

??被稱爲the null-coalescing operator

+0

現在這很棘手:) :) :)我是'''的一個粉絲.. ..一直使用它..沒想到用它,那樣! –

7

增加,其中來自

var connectedClients = (from x in gameServers 
         where x.ConnectedClients != null 
         from y in x.ConnectedClients 
         select new 
         { 
          x.Name, 
          x.GameType, 
          ConnectedClients = new 
          { 
           y.ClientName, 
           y.ConnectedOn, 
           y.ClientIpAddressAndPort 
          } 
         }).ToList(); 
+0

ahh。所以你可以在兩個'from'之間放置一個'where'子句?從來不知道... –

+0

@ Pure.Krome是的,你可以做到這一點。試一試。 –

+0

+1,因爲這對於有類似問題的人來說可能同樣重要。 –

0
IEnumerable<GameServer> gameServesWIthConnectedClients = from x in gameServers 
         where x.ConnectedClients != null 
         select x; 

var connectedClients = from y in gameServesWIthConnectedClients 
         select 
          new 
           { 
            y.Name, 
            y.GameType, 
            ConnectedClients = 
          new 
           { 
            y.ConnectedClients.ClientName, 
            y.ConnectedClients.ConnectedOn, 
            y.ConnectedClients.ClientIpAddressAndPort 
           } 
           }; 
connectedClients = connectedClients.ToList(); 
相關問題