2016-10-21 11 views
0

私はデータベースから文書を取得しようとしていますが、それは望ましい方法ではできません。 MobogDB C#Driverを使用してエンティティのカスタムシリアライザを作成する方法は?

var filter = Builders<Book>.Filter.Eq(x => x.Id == new ObjectId(id), true); 
var result = await coll.Find(filter).ToListAsync(); 

しかし Findメソッドを実行するときに、この場合には InvalidOperationExceptionがスローされます。 データを取得するために、このアプローチを使用するように便利なようです。私はこのフィルタを使用する場合 Unable to determine the serialization information for x => (x.Id == new ObjectId(value(BookService.Controllers.ImportController+<>c__DisplayClass1_0).id)).

public class Book 
{ 
    [BsonId] 
    public ObjectId Id { get; set; } 

    public string Author { get; set; } 

    public string Title { get; set; } 
} 

それ以外の場合は、::例外テキストは

var filter = Builders<Book>.Filter.Eq("_id", new ObjectId(id)); 

にはすべての例外が存在しないと結果が適切なエンティティインスタンスが含まれています。 x.Idを使用すると、_idフィールドで検索することを意味するが、それを行う方法はわからないということを判断するために、カスタムシリアライザを実装する必要があるようです。あるいは、この仕事をするための他の方法がいくつかありますか?

答えて

1

このコードは正しくありません。これに

var filter = Builders<Book>.Filter.Eq(x => x.Id == new ObjectId(id), true); 

変更して、それはあなたの問題修正する必要があり

var filter = Builders<Book>.Filter.Eq(x => x.Id, new ObjectId(id)); 
私はいつも私のC#のモデルに文字列としてのObjectIdを表し、の属性としてBsonRepresentationを使用

正しいシリアル化を確実にする

[BsonRepresentation(BsonType.ObjectId)] 
[BsonId] 
public string Id { get; set; } 

あなたのクエリはちょうどl IKEこの:

var filter = Builders<Book>.Filter.Eq("_id", id); 
var result = await coll.Find(filter).ToListAsync(); 

あるいはさらに良い

var result = await coll.Find(x => x.Id == id).ToListAsync(); 
+0

あまりにも長い間anasweringないため申し訳ありません。ありがとう。あなたのソリューションはまさに私が探していたものです! –

+0

私は助けることができてうれしい – pieperu