2011-12-06 3 views
2

상점 목록 (storeList) 개체가 있습니다. (상점 목록으로 구성) 각 상점에는 주소 목록이 있습니다. 각 주소에는 PHYSICAL, ALTERNATIVE 또는 MAILING이 될 수있는 AddressType 속성이 있습니다.Linq. 목록에서 목록을 조회하는 방법은 무엇입니까?

이 내 첫 번째 시도이다 : 나는 단지 하나의 항목으로 목록을 얻을 것으로 예상 결과

StoreAddressList result = 
    (from str in storeList 
    where 
    str.AssetAddresses.Any(p => p.AddressType.Name == "PHYSICAL") 
    select str.AssetAddresses).FirstOrDefault(); 

(여기서 내가 속성을 수정할 수 있도록 물리적 주소 개체를 반환하려고

주소 유형은 PHYSICAL). 그러나 3 가지 항목 (3 가지 유형 모두 포함)이있는 목록을 얻습니다. 여기 뭐가 잘못 됐니?

감사

+0

선택하려고 무엇의 주소를 얻을 수 있도록 또한 storeList에 where 될 것이 같은데요? 주소 유형 중 하나가 "실제"인 목록의 첫 번째 상점을 선택하려는 것 같습니다. 그 맞습니까? – ken

답변

9

, 주소의 목록을 각 점포를 투영하여 주소 목록의 목록을 평평하게 평탄화를 달성하기 위해 SelectMany을 사용하고 만 주소 유형은 물리적 곳 사람들을 :

var addressesToModify = 
    storeList.SelectMany(store => store.AssetAddresses) 
      .Where(address => address.AddressType.Name == "PHYSICAL"); 
쿼리 구문에서

: 우리가 설명 정확히 같은 읽는 방법

var addressesToModify = 
    from store in storeList 
    from address in store.AssetAddresses 
    where address.AddressType.Name == "PHYSICAL" 
    select address; 

알 수 있습니다. 각각의 store에서 storeList, 각 addressstore.AssetAddresses에서 address이 실제 주소 인 경우 address을 선택하십시오.

이제 쿼리 결과를 반복하고 필요에 따라 수정하십시오.

또한, 나는 강력하게 열거

public enum AddressType { Physical, Alternative, Mailing } 

을 만들고 이러한 유형의

public AddressType AddressType { get; } 

을의 수 Address.AddressType를 변경 제안하고 당신이 쓸 수

where address.AddressType == AddressType.Physical 

또는

.Where(address => address.AddressType == AddressType.Physical); 
+0

:-). 너 빠르구나. 고마워. – bobetko

2

SelectMany을 사용해야 주소 목록을 평평하게 만들 수 있습니다.

var result = 
    storeList 
    .SelectMany(store => store.AssetAddress) 
    .Where(address => address.AddressType == "PHYSICAL") 
    .FirstOrDefault(); 

당신은 당신이 관심있는 가게.

관련 문제