BSonElement для c # Тип данных - PullRequest
1 голос
/ 24 февраля 2012

У меня есть «BSonElement» в моей БД, и я повторил попытку с помощью стандартного запроса.

Проблема заключалась в том, что я не могу привести BsonDocument к типу.

Пример:

ОБНОВЛЕНИЕ 1:

 public partial class item_Stat
{

    [BsonExtraElements]
    public BsonDocument all_stat;
}

По сути, у меня есть свойство (поле) БД 10-15, которое я могу прочитать с помощью "BsonExtraElements".Таким образом, я могу повторить свойство без определения его в C #.

all_stat, может иметь свойство 10-15-20, которое динамически изменяется.C # является типизированным языком, поэтому я не могу определить это свойство в C #, и я использовал ExtraElements.

Проблема заключается в том, что я ЗАПРОСИРУЮ объект из БД.

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

Ответы [ 3 ]

5 голосов
/ 25 февраля 2012

BsonElement.Value имеет тип BsonValue.Используйте один из методов As * для соответствующего преобразования.Какой тип значения здесь?Так как у вас есть определенный пользователем тип, лучшим вариантом будет получить, как говорит Барри выше.Если вы хотите настроить «отображение», обратитесь к руководству по сериализации http://www.mongodb.org/display/DOCS/CSharp+Driver+Serialization+Tutorial

5 голосов
/ 24 февраля 2012

Вот пример того, что вы можете сделать, учитывая класс из вашей доменной модели, например:

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>
3 голосов
/ 29 февраля 2012

Вы не можете просто разыграть 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());
...