2012-10-18 4 views
0

데이터베이스 (tblCar 및 tblPlane)에 두 개의 매우 유사한 테이블이 있습니다. 그들은 같은 열을 가지고 있으며 tblCar는 car_로 시작하고 tblPlane은 pl_로 시작합니다. 즉 car_id, pl_id 등두 개의 서로 다른 유형의 목록 정렬 및 연결

나는 테이블에서 행을 얻을 그들을 연결 : 잘 작동

var cars = (from x in db.tblCar select x).ToList(); 
var planes = (from x in db.tblPlane select x).ToList(); 
var result = cars.Cast<object>().Concat(planes.Cast<object>()); 

합니다.

그러나 두 테이블에는 cat_update 및 pl_update라는 업데이트 날짜 열이 있습니다. 그 유형은 DateTime이며이 열에 의한 결과 목록을 가장 최근에 주문해야합니다.

등록 정보의 이름이 다른 경우 주문하는 방법은 무엇입니까?

+0

아마도 가장 우아한 해결책은 아니지만 결과에 따라 반복하고 DateTime 필드를 키 (typeOf를 기반로하는 조건절을 사용)로 사용하여 SortedList 클래스에 각 항목을 삽입 할 수 있습니다. – maralfol

답변

1
var orderedResult = cars.Cast<object>().Concat(planes.Cast<object>()) 
    .OrderBy(o => o is Car? ((Car)o).car_date : ((Plane)o).pl_date); 

그러나 이것은 그리 안전하지 않습니다. 테이블에 동일한 열이있는 경우 왜 모든 값이 동일한 열에있을 수 없으며 비트 필드가 자동차인지 평면인지 알려줍니다.

+0

왜 안전하지 않습니까? –

+0

@Srcee 실수로 실수를하면 컴파일러 오류 대신 런타임 오류까지 자신을 열어 놓은 객체로 캐스팅하기 때문입니다. –

1

Vehicle 클래스와 같은 Car 및 Plane에 대한 부모 유형 생성을 고려해 봤습니까? 차량 클래스의 필드 중 하나가 _date입니다. 그래서 코드는 다음과 같습니다

var orderedResults = cars.Cast<Vehicle>().Concat(planes.Cast<Vehicle>()) 
     .OrderBy(v => v._date); 

당신은 시간 유형 saftey & 좀 더 논리적 인 유형 계층 구조를 컴파일 유지하는이 방법을 모든 열이 두 테이블에서 동일하기 때문에 당신이 어떤 어려움을 표현하지 말았어야 차량으로.

0

이처럼 할 수있는 :

private class VehicleHolder 
{ 
    public DateTime Date { get; set;} 
    public object Vehicle { get;set; } 
} 

//... 

var cars = (from x in db.tblCar 
      select new VehicleHolder() { Date = x.car_date, Vehicle = x }).ToList(); 
var planes = (from x in db.tblPlane 
       select new VehicleHolder() { Date = x.pl_date, Vehicle = x }).ToList(); 

var result = cars.Concat(planes).OrderBy(v => v.Date).Select(v => v.Vehicle); 

하지만 크리스 동의 : 공통 부모 타입이 훨씬 깨끗하다.

관련 문제