2012-02-16 3 views
0

나는 BaseEvent이라는 기본 클래스를 가지고 있습니다.
그리고, BaseEvent에서 파생 된 3 개 클래스 : Derived1, Derived2, Derived3LinqToSql의 상속과 다형성

가정하자 우리는 다음 쿼리 한 :

Database.BaseEvents.Where(e => e.EventsCategories.Any(
     c => c.EventCategories== category.OID)).ToList(); 

가 어떻게 할 수있는 파생 개체의이 쿼리 반환 수집하지 BaseEvent 것을?

감사합니다.

UPDATE :
picture

하지만 형식은 Cast 방법 Film

+0

당신은이 배열은 하드 코딩 방법 코드 예제를 제공 할 수 있을까요? 예를 들어 : 목록 {2,3,5,7}에는 4 개의 정수가 있습니다. 2,3,5,7 – Archeg

+0

앞에서 대답했듯이 Linq2Sql에 사용할 파생 형식을 알려주는 판별 자 필드를 설정해야합니다. –

답변

1

사용해야합니다 : 그것은 이해할 수 있도록, 당신이 설정 Linq2Sql을했습니다

Database.BaseEvents.Where(e => e.EventsCategories.Any(
    c => c.EventCategories== category.OID)).Cast<DerivedType>().ToList(); 

즉 가정하여 EventCategories 속성은 discriminator입니다.

업데이트 : discriminator 필드는 필드의 값에 따라 사용할 형식을 Linq2Sql에 알려줍니다. 그러한 필드를 설정하지 않은 경우. Linq2Sql은 항상 기본 유형을 반환합니다. A google query은 이것을 수행하는 방법에 대한 좋은 소식을 많이 얻을 것입니다.

+0

하지만, 나는 어떤 객체가 반환 될지 알지 못합니다. 이 쿼리가 derived1과 derived2라는 2 개의 객체를 반환한다고 가정합니다. – user348173

+0

DerivedType2 인 DerivedType – Archeg

+0

@ user348173이 아닌 BaseEvents가있는 경우 Cast가 예외를 throw합니다. 그렇게 할 수 없으면 예외가 발생합니다. 다른 유형의 객체 목록을 포함 시키려면 그 목록을 공통 상위 유형으로 입력해야합니다.이 유형을 다형성 – Archeg

-1

당신은 방법을 OfType 사용할 수 있습니다

Database.BaseEvents.Where(e => e.EventsCategories.Any(
    c => c.EventCategories== category.OID)).OfType<Derived1>.ToList(); 

만 Derived1 유형 난 당신이 컬렉션의 파생 개체의 다른 유형을 가질 수 있음을 볼 수있는 코멘트에서

1

를 반환합니다.

이 경우 컬렉션을 특정 파생 된 유형으로 캐스팅 할 이유가 없으므로 이제는 베이스 유형의 콜렉션을 반환하십시오. 그러나 컬렉션의 모든 실제 객체가 Derived1의 구체적인 유형이있을 것이다, Derived2Derived3는 ...

+0

아니요,이 쿼리는 BaseEvent를 반환합니다.질문의 그림을 참조하십시오. – user348173

+0

@ user348173 : 그 목록의 내용은 무엇입니까? ? 어떻게 그 목록을 만들고 채우고 있습니까? – Tigran