繁体   English   中英

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

[英]How to write custom serializer for entity with 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字段进行搜索,但是我不知道该怎么做。 也许还有其他方法可以使这项工作?

此代码不正确:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM