2014-07-18 30 views
1

我正在使用C#VS2013 Express,希望對編寫LINQ語句有所幫助。使用LINQ獲取列表中的項目

每個MapCompany都有一個MapLocations列表,MapCompany和MapLocation都有一個userName字段。

這裏是我的代碼:

IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies = await db.mapCompanies.Where(mc => mc.userName.Equals(userName)).ToListAsync(); 
List<MapLocation> mapLocations = new List<MapLocation>(); 
foreach (var mapCompany in mapCompanies) 
{ 
    foreach (var mapLocation in mapCompany.mapLocations) 
    { 
     if (mapLocation.userName.Equals(userName)) 
     { 
      mapLocations.Add(mapLocation); 
     } 
    } 
} 

我是新來的LINQ,並希望寫一個LINQ聲明,將獲得具有特定用戶名的所有MapLocations。

我上面的代碼有效,但我希望獲得一些幫助,以便將其作爲LINQ語句進行編碼。

+1

你試過了什麼? – JleruOHeP

回答

5

如果我沒有記錯,

IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies = await db.mapCompanies.Where(mc => mc.userName.Equals(userName)).ToListAsync(); 

var mapLocations = mapCompanies.SelectMany(mapCompany => mapCompany.mapLocations) 
           .Where(mapLocation => mapLocation.userName.Equals(username)); 

或由馬塞爾的B評論,查詢語法提示:

var mapLocations = from mapCompany in mapCompanies 
        from mapLocation in mapCompany.mapCompanies 
        where mapLocation.userName.Equals(username) 
        select mapLocation; 

,當然,我會做這個case和其他任何我可以的,但如果你通常在寫這樣的LINQ表達式時遇到困難,你也可以使用yield return模式。再次,我不會在這裏,但我也會包括這一點。

public IEnumerable<MapLocation> GetLocations(IEnumerable<CanFindLocation.Models.MapCompany> mapCompanies) 
{ 
    foreach (var mapCompany in mapCompanies) 
    { 
     foreach (var mapLocation in mapCompany.mapLocations) 
     { 
      if (mapLocation.userName.Equals(userName)) 
      { 
       yield return mapLocation; 
      } 
     } 
    } 
} 

顯然,這並不回答你的問題,我的第一個代碼塊這樣做,但是這仍然是做出來你有這樣的一個更清潔,通常更好的辦法,因爲這將讓你受益來自IEnumerable<T>的延期性質。

+1

可能會爲您的代碼添加查詢語法......當我是Linq新手時,我發現查詢語法更容易,因爲它更接近於foreach語法。 –

+0

@MarcelB偉大的一點。我總是忘記查詢語法存在。我從不使用它。我有沒有得到那個權利? –

+0

看起來不錯...我也從來沒有使用它。至少不會再有。但查詢語法引發了我對Linq的興趣。 –