2011-08-10 5 views
1

동일한 기본 클래스에서 상속 된 여러 LINQ 클래스가 있습니다. 각 Linq 클래스에는 자체 테이블이 있고 기본 클래스는 다른 테이블에 대한 링크의 일종입니다. 나는 그 관계를 설명하려고 노력할 것이다. :C# 인터페이스가있는 Linq 쿼리

//Base Class 
abstract class Element<T> 
{ 
    public string Name {get; set;} 
    public string Species {get; set;} 
} 

public partial class DogElement : Element<DogElement> 
{ 
    public int Legs {get; set;} 
    public bool hasHair {get; set;} 
} 

public partial class CatElement : Element<CatElement> 
{ 
    public bool hasWiskers {get; set} 
} 

그래서 DogElement와 CatElement는 데이터베이스의 서로 다른 물리적 테이블이다. Species 클래스는 Species 테이블에서 읽습니다. 기본적으로 Species 테이블로 T 테이블을 그룹화하고 .Species를 설정 한 후 결과를 T로 반환하는 Element의 일반 함수가 필요합니다.

//Assume T is DogElement for this example 
public IQueryable<T> Collection 
{ 
    using (DataBase db = new DataBase()) 
    { 
    var k = from t in db.GetTable<T>() 
      where t.SomeID == SomeOtherID 
      select t; 

    k = { {Legs = 4, HasHair = True, Species = <null>, Name = <null>}, ...} 

    I basically want a query that will return an IQueryable<DogElement> with Name 
    and Species set from a join query. What is the best way to set the Name and 
    Species values? 

    return k; 
} 
+0

class 추상 요소 → 추상 클래스 요소 shenhengbin

답변

-1

본질적으로 SQL에 상속을 처리하도록 요청합니다 (그렇게하지는 않습니다 ...). LINQ는 상속을 모델링하지 않습니다. 좋은 객체 관계형 매퍼 (ORM)는 좀 더 일반적으로 함께 조각을 만드는 데 도움이됩니다.

즉, 여기에 간단한 토론이 있습니다.

먼저, 각 종 - 동물 쌍에 대해 하나의 LINQ 쿼리를 작성하는 것이 더 좋습니다.

당신은 노동 조합을 작성하고, LINQ 선택을 전환하고, 새로운 동물을 만들고, 그 동물을 한 종의 동물에게 던질 수 있습니다 ... 그리고 나서 LINQ 문 밖에서 T 출구로 나가십시오. 이런 종류의 진술은 지저분 해 보인다.

큰 유니온 진술보다 비효율적이지만,이 유지 보수가 용이 한 옵션을 고려해 보셨습니까? 데이터베이스 (느리게)로이 여행을하지만 더 유지 보수, 그리고 종종를 통해 첫 번째 패스에 코드를 최적화하지 않는 것이 좋다

var a from speciies select .. 

if(T is Dog){ 
    additional linq statement} 
else if(T is Cat){ 
    additional linq statement} 

.

+0

나는 그것에 대해 생각해 내 가을 돌아올 것입니다. 나는 이것을 할 수있는 매끄러운 린크 방법이있을 거라고 생각했다. '(k에서 (s에서 db.whatever 선택 s) 조인 h 조 k.ID에 db.h에서 h.ID와 E 선택 E). 캐스트 ()' – Cameron

+0

을 동물 - 동물 쌍으로 선택하고 typeof (T)에 따라 실행할 대상을 선택합니다. 그것이 내가 선호하는 옵션입니다. 약간의 오버랩이있을 수 있지만 적어도 기본 클래스 부분은 예측 가능합니다. – sgtz

+0

좋아. 도와 주셔서 감사합니다. – Cameron