2017-10-02 12 views
0

私は以前のSO articleで提案を使用し、c#でmongodbにアクセスしました。c#でmongodbコレクションを返すとNULLが返される

著者のBelgiは本質的に追加のObjectIdプロパティを持つPOCOのラッパーオブジェクトを使用しました。

その記事から:このラッパーを使用して

public static class Extensions 
{ 
    public static T Unwrap<T>(this MongoObject<T> t) 
    { 
     return t.Element; 
    } 
} 
public class MongoObject<T> 
{ 
    [BsonId] 
    private ObjectId _objectId; 
    public T Element { get; } 

    public MongoObject(T element) 
    { 
     Element = element; 
     _objectId = new ObjectId(); 
    } 
} 

、私がコレクションを照会しようとした:

IMongoDatabase db = client.GetDatabase("test"); 
IMongoCollection<MongoObject<MyClass>> collection = db.GetCollection<MongoObject<MyClass>>("mylist"); 

IMongoQueryable<MyClass> list = collection.AsQueryable().Select(t=>t.Element); 
int count = list.Count(); 

予想通りカウントは5です。しかし、私がリストコレクションを反復するとき、リストの5つのメンバーのそれぞれはnullです。

foreach (MyClass item in list) 

私が間違っていることについてのアイデアはありますか?

答えて

0

このシナリオでは、ドライバが実際にmongoDbにT Elementを保存しているとは確信していません。

コードをコピーし、T Elementの上に[BsonElement]タグを追加して修正しました。このように:

public class MongoObject<T> 
{ 
    [BsonId] 
    private ObjectId _objectId; 
    [BsonElement] 
    public T Element { get; } 

    public MongoObject(T element) 
    { 
     Element = element 
    } 
} 

これは、ドライバがmongoDbに保存する際に要素を無視しないようにします。他の選択肢は、Elementを公開してpublic T Element { get; set; }で設定できるようにすることですが、そのオプションが必要かどうかはわかりません。

_objectId = new ObjectId();を削除したことに注意してください。あなたは手動で行う必要はありません、ドライバはあなたのためにそれを行います。

これが役に立ちます。乾杯!

関連する問題