带有C#返回null的迭代MongoDB系列



我在上一篇文章中使用了一个建议,用c#访问mongodb。

在其中,作者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)

关于我做错了什么的想法?

我不确定您什至不确定要返回任何内容,因为在这种情况下,我不确定驱动程序实际上将 T Element保存到mongodb中。

我复制了您的代码,并通过在T Element上方添加[BsonElement]标签来修复它。这样:

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

这会使驱动程序保存到mongoDB时不会忽略您的元素。其他选项是通过public T Element { get; set; }公开设置元素,但我不确定您是否想要该选项。

注意我如何删除_objectId = new ObjectId();。您不需要手动执行此操作,驾驶员会为您做。

希望这会有所帮助。欢呼!

最新更新