2017-01-03 146 views
1

如果問題標題混亂,我很抱歉,我有一個場景,其中有兩個用戶類和地址。從另一個列表的ID獲取列表中的項目

public class User 
{ 
    public int userId { get; set; } 
    public string userName { get; set; } 

    public List<Address> address { get; set; } 
} 

public class Address 
{ 
    public string AddressLine { get; set; } 
    public string City { get; set; } 
    public string State { get; set; } 

    public int UserId { get; set; } 
} 

UserId是類地址中的外鍵,我有兩個List,用戶列表和地址列表。用戶地址的值爲空,我想獲得每個用戶的地址列表,我如何實現這一點?我知道我們可以使用foreach,但有沒有辦法通過linq來實現這一點?以下是示例代碼。

class Program 
{ 
    static void Main(string[] args) 
    { 
     var users = new List<User>(); 
     users.Add(new User { userId = 1, userName = "User 1" }); 
     users.Add(new User { userId = 2, userName = "User 2" }); 
     users.Add(new User { userId = 3, userName = "User 3" }); 
     users.Add(new User { userId = 4, userName = "User 4" }); 

     var address = new List<Address>(); 
     address.Add(new Address { AddressLine = "Address 1", City = "City 1", State = "State 1", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 1 Dup", City = "City 1", State = "State 1", UserId = 1 }); 
     address.Add(new Address { AddressLine = "Address 2", City = "City 2", State = "State 2", UserId = 2 }); 
     address.Add(new Address { AddressLine = "Address 2 Dup", City = "City 2", State = "State 2", UserId = 2 }); 
     address.Add(new Address { AddressLine = "Address 3", City = "City 3", State = "State 3", UserId = 3 }); 
     address.Add(new Address { AddressLine = "Address 3 Dup", City = "City 3", State = "State 3", UserId = 3 }); 


    } 
} 
+5

只是一個關於你的架構筆記...我會考慮是否有可能修改它。用地址存儲用戶ID是一個糟糕的設計。如果兩個用戶住在同一個地址,該怎麼辦?您應該真正擁有多對多的關係,即存儲帶有用戶ID和地址ID的中間表。 –

+0

這只是一個例子,因爲我不能發佈我的原代碼。這將是安全漏洞,所以我很喜歡創建類似的虛擬數據。我同意這種模式設計是錯誤的。 –

+0

LINQ也使用foreach。 [請點擊此處](https://referencesource.microsoft.com/) – Badiparmagi

回答

3

Linq版本

List<User> result = users.Select(x => 
         new User() { 
          userId = x.userId, 
          userName = x.userName, 
          address = address.Where(y => y.UserId == x.userId).ToList() 
         }).ToList(); 

IMO更具可讀性foreach版本

foreach (User user in users) 
    user.address = address.Where(y => y.UserId == user.userId).ToList(); 
+0

謝謝你的答案,對不起,如果這是愚蠢的問題,但如果我使用linq foreach,而不是選擇它會更慢或更快?哪個更好選擇還是Linq Foreach?像這樣users.ForEach(t => t.address = address.Where(a => a.UserId == t.userId).ToList()); –

+1

它會更快也注意到這一點。它創建一個'User'的副本,因此每個對派生列表中的'User'的更改都不會影響實際的'User'。這可能是也可能不是你想要的。使用'linq'總是比較慢。 – Bauss

+0

你的意思是選擇會更快?我可以改變實際的用戶,因爲這是要求。 –

1

這是一個SelectWhere相當簡單。

users = users.Select(u => { u.address = address.Where(a => a.UserId == u.userId).ToList(); return u; }).ToList(); 

更可讀的版本:

users = users.Select(u => 
    { 
     u.address = address.Where(a => a.UserId == u.userId).ToList(); 

     return u; 
    }).ToList(); 
相關問題