我的数据库中有一个“BSonElement”,我使用标准查询重试它。
问题在于我无法将BsonDocument转换为Type。
示例:
更新1:
public partial class item_Stat
{
[BsonExtraElements]
public BsonDocument all_stat;
}
基本上,我已经进入了我的DB 10-15属性(字段),我可以用“BsonExtraElements”阅读。通过这种方式,我可以在不定义属性的情况下重试属性 在C#。
all_stat,可以有10-15-20属性改变。 C#是类型语言,因此我无法在C#中定义此属性,并且我使用了ExtraElements。
问题是当我从DB查询对象时。
var item_db = myMongoCollection.find(theQuery); // find the OBJECT
item_db.all_stat // all the property hare HERE
// find the property "category_01"
var i = item_db.all_stat.Where(p => p.Name == "category_01").Single();
// ok, i have found the Category, so i can cast it to C# Data Type
var typed_value = (ItemStatSingle) i.Value // BsonElement to ItemStatSingle
答案 0 :(得分:5)
以下是您可以执行的操作示例,给出了域模型中的类,如:
public class Employee
{
public ObjectId Id { get; set; }
public string Name { get; set; }
}
您可以像这样使用您的课程:
var collection = database.GetCollection<employee>("employees");
var employee = new Employee { Name = "John Smith" };
collection.Insert(employee);
employee = collection.FindOne();</employee>
答案 1 :(得分:5)
BsonElement.Value的类型为BsonValue。使用As *方法之一进行适当的转换。这里的价值是什么类型的?由于您拥有用户定义的类型,因此最佳选择是检索Barrie上面所说的。如果你想自定义&#34;映射&#34;请参阅序列化教程http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial
答案 2 :(得分:2)
您不能只从额外元素中投射BsonDocument。你必须反序列化它。
假设你有一个C类
public class C
{
public int X;
}
和一个extraDocuments变量(类似于你的item_db.all_stat属性)初始化如下:
var extraElements = new BsonDocument();
var c = new C { X = 1 };
extraElements["c"] = c.ToBsonDocument();
然后你可以提取“c”值并反序列化它:
var r = BsonSerializer.Deserialize<C>(extraElements["c"].AsBsonDocument);
Console.WriteLine(r.ToJson());