如何使用MobogDB C#Driver为实体编写自定义序列化程序?

时间:2016-10-21 12:20:47

标签: c# mongodb serialization mongodb-.net-driver

我试图从数据库中获取文档,但我无法以理想的方式执行此操作。 使用这种方法检索数据似乎很方便:

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

但在这种情况下,执行InvalidOperationException方法时会抛出Find。例外文字: 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 个答案:

答案 0 :(得分: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; }

这样您的查询就像这样:

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();