2014-07-18 4 views
1

저는 C# VS2013 Express를 사용 중이며 LINQ 문을 코딩하는 데 도움이 필요합니다.LINQ를 사용하여 목록에있는 항목 가져 오기

각 MapCompany에는 MapLocations 목록이 있으며 MapCompany 및 MapLocation에는 userName 필드가 있습니다. 내가 LINQ에 새로운 오전 특정 이름을 가진 모든 MapLocations을 얻을 것이다 LINQ 문을 작성하려합니다

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 문으로 코딩 해주십시오.

+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; 

그리고, 나는이에 그렇게 할 것 케이스 및 다른 수 있지만 일반적으로 이와 같은 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에 대한 관심을 불러 일으켰습니다. –

관련 문제