2016-12-22 2 views
-1

이전 버전의 mongo 드라이버에서 2.x 드라이버로 업데이트하는 중입니다. 우리가 이전에 가지고 있던 코드를 업데이트하려고 시도하고 있지만, 어떻게 발견하는지 고심하고 있습니다.MongoDB C# 드라이버 (v2.4)가있는 Slice (projection) 파생 클래스 배열

public class BaseClass 
{ 
    public string Name { get; set; } 
} 

public class DerivedClass : BaseClass 
{ 
    public IEnumerable<DataClass> Items { get; set; } 
} 

public class DataClass 
{ 
    public string Element1 { get; set; } 
    public string Element2 { get; set; } 
} 

우리는이 같은 코드를 가지고 이전 드라이버로 :

var result = collection 
       .Find(query) 
       .SetLimit(10) 
       .SetFields(Fields.Slice("Items", 0, 1)); 

을 그리고 새 것으로 우리는 다음과 같은 코드가 있습니다

우리의 클래스 구조는 다음과 같은 비트가

var result = collection 
       .Find(query) 
       .Limit(10) 
       .Project<BaseClass>(...); 

이 사례에서 데이터는 사용자 의견을 나타내며 두 ​​가지 유형이있을 수 있습니다. 우리의 query 객체는 페이징을 처리하는 코드입니다. 파생 된 형식의 경우 Items 배열의 첫 번째 요소 만 반환하려고합니다. 일치하는 모든 댓글을 함께 반환해야합니다.

제가 직면 한 문제는 Project이 정적으로 입력되어 있으므로 Builders<BaseClass>.Projection.___이 필요하다는 것입니다. IFindFluent<BaseClass, BaseClass>As<T> 옵션을 가지고 있지만 예상 투영은 ProjectionDefinition<BaseClass, DerivedClass>입니다. 그런 정의 객체를 만들 수있는 방법이 없습니다. 몽고 드라이버를 간략히 살펴본 후에도 볼 수 없습니다.

이 작업을 수행하는 쉬운 방법이 있습니까?

+0

왜 누군가가 이것을 떨어 뜨렸는지 잘 모르겠습니다. 나이 든 Mongo 드라이버로는 불가능했던 것이있을 때, 새로운 드라이버로 갑자기 그것을 가능하게 할 수는 없습니다. – john

답변

0

논리적으로 생각하지 않았습니다.

새 드라이버를 사용하면 as 연산자 나 아마도 표준형 캐스트를 사용해야 만 올바른 필드를 찾을 수 있습니다.

var result = collection 
       .Find(query) 
       .Limit(10) 
       .Project<BaseClass>(d => (d as DerivedClass).Items, 1); 

그래서 나는 새로운 하나를하려고 생각하지 않았다 이전 드라이버와 함께 일하지 않았다.