使用c#迭代mongodb集合返回null

时间:2017-10-02 22:11:39

标签: c# mongodb

我在之前的SO article中使用过建议,使用c#访问mongodb。

其中作者Belgi基本上为POCO使用了一个包装器对象,并附加了一个ObjectId属性。

从那篇文章:

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个成员中的每一个都为空。

foreach (MyClass item in list)

关于我做错的任何想法?

1 个答案:

答案 0 :(得分:0)

我不确定您是如何计算返回任何内容的,因为在这种情况下我不确定驱动程序是否实际将T Element保存到mongoDb中。

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

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();的。你不需要手动完成,驱动程序会为你做。

希望这会有所帮助。干杯!