2014-07-08 2 views
0

가정하자 나는 유형 A와 B가의 하위 유형이며, p는 A의 공공 재산 인 B를 가지고쿼리 서브 타입을 통해

쿼리 구축 할 때 :

Query<B>.EQ(b => b.p, x) 

나는 것을 B 형의 객체 만 페이지 속성 비교 될 것이라고 기대하지만, 대신에 나는 내장 쿼리

이 컬렉션의 모든 항목 (A와 B)를 통해 적용

{ p: x } 
, 그래서의 아무 소용이 없다는 것을 발견 타입 discriminator. OfType() LINQ는 형식 판별자를 쿼리에 추가하지만 쿼리에만 사용되며 제거 또는 업데이트에는 사용할 수 없습니다.

예 :

class A 
{ 
    public int p; 
} 

class B : A 
{ 
    public int q; 
} 

질의 :

Collection.AsQueryable<A>().OfType<B>().where(b => p == x) 

복귀 P는 X와 동일 유형 B의 모든 요소 있지만 명령

Collection.Remove(Query<B>.EQ(b => b.p, x)) 

이 모든 요소를 ​​삭제 A와 B를 입력하십시오. 여기서 p는 x와 같습니다. 유형 B의 요소 만 제거하려고합니다.

어떻게해야합니까?

+0

을 구축하는 것입니다? –

+0

속성뿐만 아니라 객체 유형을 검사하는 쿼리 – user1275011

답변

0

MongoDB의 Generic 드라이버는 사용의 편의를 위해 제공된 것이며 실제 운영상의 효과가 없습니다.

필터와 유형 판별 자 제약 조건을 모두 사용하여 쿼리를 작성해야합니다. 당신이 형 필터 필요 달성하기 위해 두 필터를 함께 결합하고 QueryBuilder (일반 수 없습니다, 당신은 판별 자신을 지정해야합니다) : 당신이 원하는 쿼리가 무엇을

var builder = new QueryBuilder<B>(); 
Collection.Remove(builder.And(Query<B>.EQ(b => b.p, x), Query.EQ("_t", typeof(B).Name))); 
+0

감사합니다. 드라이버가 Query .OfType()과 같이 빌더 내부에서 사용되며 "_t"속성을 직접 사용하지 않는 것과 같은 특별한 쿼리 유형을 구현할 것을 제안합니다. 감사! – user1275011