2016-12-22 64 views
-1

我們正在從較早版本的mongo驅動程序更新到2.x驅動程序。我試圖更新我們之前的一些代碼,但我正在努力研究如何。帶有MongoDB C#驅動程序的片(投影)派生類'陣列(v2.4)

我們的階級結構是有點像這樣:

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>,我看不到任何方式創建這樣的定義對象 - 即使在簡要地查看Mongo驅動程序之後。

有沒有簡單的方法來做到這一點?

+0

不知道爲什麼有人低估了這一點。如果老的蒙戈司機不能做到這一點,你不會真的期望新手能夠突然變得可能。 – john

回答

0

看來我並沒有在邏輯上思考這個問題。

使用新驅動程序,似乎我需要做的是使用as運算符,或者大概是標準演員陣容,並且我能夠找到正確的字段。

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

這並沒有與舊的驅動程序,所以我沒有想過用新的嘗試。