2009-09-06 4 views
3

비슷한 방식으로 쿼리해야하는 매우 유사한 스키마가있는 DB에 2 개의 테이블이 있습니다. linq 엔티티에 대한 부분 클래스를 작성한 다음 클래스가 인터페이스를 구현하도록 만들었습니다. IEvent는 필 요한 서명과 일치하는 모든 특성을 정의합니다. 모든 것이 좋으며, 결과를 IQueryable에 캐스트하고 동일한 코드를 사용하여 둘 이상의 소스에서 가져온 데이터를 처리 할 수 ​​있습니다. 내가 알 수없는 것은 "DataSource"(즉, 이벤트 테이블)가 현재 활성화되어 있으므로 테이블을 가져 오는 좋은 방법이다. 그래서 현재 다른 데이터 소스가 추가되면 업데이트해야하는 불쾌한 switch 문이있다. 1 비트 좋아해. 사람은 늦은 여기에, 모든 스마트 아이디어를 가지고와 내 머리는 ... 실패 : -S동적 Linq.Table <TEntity> 가능합니까?

코드는 다음과 같이 진행됩니다

private IQueryable<IEvent> getEvents(IEnumerable<int> IDs) 
     { 
      var db = new EventDataContext(); 
      // activeDataSource is an enum defined elsewhere 
      switch (activeDataSource) 
      { 
       case DataSource.Source1: 
        return db.Events1.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
        break; 
       case DataSource.Source2: 
        return db.Events2.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
        break; 
      } 
     } 

답변

4

내가 방법은 일반적인 만들고 DataContext.GetTable()를 사용하여 제안을 :

private IQueryable<IEvent> getEvents<T>(IEnumerable<int> IDs) 
    where T : class, IEvent 
{ 
    var db = new EventDataContext(); 
    return db.GetTable<T>.Where(e => IDs.Contains(e.ID)).Cast<IEvent>(); 
} 
+0

안녕하세요, 이것은 내가 찾던 그냥 뭐처럼 보였다하지만 난 그것을 구현하는 tryed 때 나는 "T는 매개 변수 'TEntity'로 사용하기 위해 참조 형식이어야합니다"VS에서 다음과 같은 오류가 발생했습니다 . Event1과 같은 클래스에 제약이 가해 지지만 그 종류의 목적을 상실합니다. : – withakay

+0

T에 클래스 제약 조건을 추가했습니다. 즉, T는 IEvent를 구현하는 모든 클래스가 될 수 있습니다. – jrummell

+0

안녕하세요, 답변을 주셔서 감사합니다.이 모든 것을 알아야하고 엄밀히 말하면 내 질문에 답변했습니다. 그래서 나는 당신에게 크레딧을 줄 예정이다. 나는 T가 무엇이되어야 하는지를 결정하는 문제로 여전히 남아있다. 나는 설정 파일에서 DataSource를 가져오고 싶다. 나는 그것을 피하고 있었지만, – withakay

관련 문제