我在上一篇文章中使用了一个建议,用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();
。您不需要手动执行此操作,驾驶员会为您做。
希望这会有所帮助。欢呼!