我在之前的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)
关于我做错的任何想法?
答案 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();
的。你不需要手动完成,驱动程序会为你做。
希望这会有所帮助。干杯!