2009-07-20 5 views
3

내가 현재이 포함 된 목록이있는 경우 수행하는 방법이 링크 된 데이터의 평탄화 세트 (저장 필자 조인 검색 이렇게 기본적으로 결과)문 Linq에에 쿼리

입니다

CountryCode (string) 
CountryStr (string) 
RegionStr (string) 
RegionID (int) 
AreaStr  (string) 
AreaID  (int) 

다음

MVC 라우트는 하나의 문자열만을 전달할 것이고, 그 다음 나는 heirachy의 올바른 레벨의 데이터와 일치해야합니다. 그래서 CountryStr을 쿼리하려고하는데 결과가 영역이 아니라면 영역을 생성합니다. 하지만 난

var datURL = (from xs in myList 
       //query 1 
       where xs.RegionStr == rarREF 
       select new 
       { 
       regionID = xs.RegionId, 
       CountryID = xs.CountryCd 
       } 
       //IF theres no results 
       where xs.AreaStr == rarREF 
       select new 
       { 
       AreaID = xs.AreaID 
       regionID = xs.RegionId, 
       CountryID = xs.CountryCd 
       }    
       ).ToList(); 

내가 지금이 일을 볼 수있는 유일한 방법

다음 개별적으로 각 쿼리를 실행 값을 반환하는 확인하고 그 중 하나를 사용 ... 쿼리 및 예를 들어 그 비트를 할 필요가있다. 더 깨끗하고 깨끗한 방법이 있기를 바랍니다.

답변

4

매우 읽기 쉽지 않을 것이다, 그러나이 같은 것을 사용하여 단일 패스에서이 작업을 수행 할 수 있습니다 :

var datURL = (from xs in myList 
       where xs.RegionStr == rarREF || xs.AreaStr == rarREF 
       select new 
       { 
       AreaID = (xs.AreaStr == rarRef ? xs.AreaID : default(int)), 
       RegionID = xs.RegionId, 
       CountryID = xs.CountryId 
       } 
      ).ToList(); 

가 다시 않다면 또한 쿼리를 쉽게 읽을 수 있습니다 약간 :

var datURL = (from xs in myList 
       let isArea = xs.AreaStr == rarREF 
       let isRegion = xs.RegionStr == rarREF 
       where isRegion || isArea 
       select new 
       { 
       AreaID = (isArea ? (int?)xs.AreaID : null), 
       RegionID = xs.RegionId, 
       CountryID = xs.CountryId 
       } 
      ).ToList(); 

비교 결과를 저장하면 나중에 재사용 할 수 있습니다. int?에 캐스트를 추가하여 "영역 없음"값으로 0을 사용하는 대신 null 허용 값을 사용하는 방법을 보여줍니다.

+0

çağdaş와 같이 default (int)를 null로 바꿔주는 것은 Id가하는 일을하는 것처럼 보입니다. 그렇다면 WhereStatement는 결과가 없다면 AreaStr을 시도한 것으로 생각합니다. 그걸로 나는 더 쉽게 추가 할 수 있다고 생각합니다 : op –

+0

Region 문자열이 영역 문자열과 결코 일치하지 않을 것이라고 가정하고 있습니다. 그래서 Where는 지역이 일치하는 목록 항목을 반환하거나 Area 성냥. 그런 다음 select에서 영역 또는 지역인지 다시 확인합니다. 읽기 쉬운 버전으로 편집하겠습니다. – dahlbyk

+0

나는이 linq 종달새로 얻을 수있는 것에 매우 깊은 인상을 받았습니다. 꽤 달콤한. 도움 주셔서 감사합니다. –

1

or 연산자를 찾으십니까? 원하는 결과가 생성되지 않습니까?

var datURL = (from xs in myList 
       where xs.RegionStr == rarREF || xs.AreaStr == rarREF 
       select new 
       { 
       AreaID = xs.AreaStr == rarREF ? xs.AreaID : default(int) 
       regionID = xs.RegionId, 
       CountryID = xs.CountryCd 
       }).ToList();