2016-12-22 3 views
-1

旧バージョンのmongoドライバから2.xドライバへの更新中です。私が以前に持っていたいくつかのコードを更新しようとしていますが、どうやって調べるのか苦労しています。MongoDB C#ドライバ(v2.4)を使用したスライス(投影)派生クラスの配列

私たちのクラス構造は少し、このようなものです:

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

そして、我々はこのようなコードを持って新しいものと::

私たちは、このようなコードを持っていた古いドライバで

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) 
       .Limit(10) 
       .Project<BaseClass>(...); 

この場合、データはユーザーのコメントを表し、2つのタイプがあります。私たちのqueryオブジェクトは、ページングを処理するコードです。派生型の場合、Items配列の最初の要素だけを返したいとします。一致したコメントをすべて返す必要があります。

私が直面している問題は、Projectが静的​​に型指定されているため、Builders<BaseClass>.Projection.___が必要であるということです。 IFindFluent<BaseClass, BaseClass>にはAs<T>オプションがありますが、予想される投影はProjectionDefinition<BaseClass, DerivedClass>です。このような定義オブジェクトを作成する方法はわかりません.Mongoドライバを短く見ても、表示されません。

これを行う簡単な方法はありますか?

+0

なぜ誰かがこれを落としたのかよく分かりません。古いMongoドライバーでは何かができなかったときに、新しいドライバーで突然それが可能になるとは本当に思いません。 – john

答えて

0

私はこれを論理的に考えていないようです。

新しいドライバでは、as演算子またはおそらく標準的なキャストを使うだけで、正しいフィールドを見つけることができるようです。

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

これは古いドライバでは機能しませんでしたので、新しいドライバで試してみることはできませんでした。

関連する問題