Как создать документ BSON с вложенными объектами ExpandoObjects, один из которых является преобразованным словарем

У меня есть expandoObject d , и я хочу выполнить итерацию по словарю и взять его ключи и значения, чтобы создать новый объект, {key:value, key:value} , а затем назначить этот новый объект d и, конечно, его сериализовать. как bsonDocument для вставки.

если просто взять словарь и выполнить .toArray(), я не получаю ошибок сериализации mongoDB, но если я создаю новый ExpandObject из этого нового объекта или просто передаю словарь, который я упомянул как d.newObject, я получаю бесполезный mondodb ошибка сериализации.

Как мне это сделать (1) и что мне не хватает в отношении того, что ожидает документ BSON в отношении того, что можно и нельзя сериализовать?


person Jason    schedule 26.01.2016    source источник


Ответы (1)


Вместо того, чтобы самостоятельно писать такую ​​функциональность динамического типа для MongoDB с ExpandoObject с нуля, вы можете извлечь выгоду из использования динамического ORM или ODM, такого как Slazure. для этого поддержка MongoDB все еще находится в стадии закрытого бета-тестирования, но вскоре должна стать общедоступной. Вот пример, когда запрос Slazure Linq возвращает некоторые документы из коллекции «TestCustomers» и где каждое имя свойства документа записывается в консоль:

using SysSurge.Slazure.MongoDB.Linq;
using SysSurge.Slazure.Core;
using SysSurge.Slazure.Core.Linq.QueryParser;

public void EnumProperties()
{
    // Get a reference to the collection
    dynamic storage = new QueryableStorage<DynDocument>("mongodb://user:[email protected]/MongoDBExample");
    QueryableCollection<DynDocument> collection = storage.TestCustomers;

    // Build collection query
    var queryResult = collection.Where("SignedUpForNewsletter = true and Age < 22");

    foreach (DynDocument document in queryResult)
    {
        foreach (KeyValuePair<string, IDynProperty> keyValuePair in document)
        {
            Console.WriteLine(keyValuePair.Key);
        }
    }
}

Если вам нужно получить фактический объект BsonDocument, вы можете получить его из объекта Slazure DynDocument, вызвав метод Document, пример ниже:

foreach (DynDocument document in queryResult)
{
    BsonDocument bsonDoc = document.Document    
    Console.WriteLine(bsonDoc["someProperty"].AsString());
person Community    schedule 26.01.2016