Как получить объекты анонимного типа из db4o - PullRequest
0 голосов
/ 09 февраля 2011

Я хотел бы хранить объекты анонимного типа в базе данных db4o.Например:

// Store an object of anonymous type to the db
var foobar = new {Foo="Ugh", Bar="Oh!"};
using (var db = Db4oEmbedded.OpenFile("db.db40"))
{
    db.Store(foobar);
}

Я использую следующий код для извлечения объектов:

// Retrieve it in a separate program
using (var db = Db4oEmbedded.OpenFile("db.db40"))
{
    var query=from dynamic fb in db select fb;
    query.Dump();
}

Однако свойства объекта недоступны, когда после извлечения: дамп дает(в Linqpad) это:

5IEnumerable<Object> (3 items)  
GenericObject 
(G) <>f__AnonymousType0`2[[System.String, mscorlib], [System.String, mscorlib]], query_vrfldn 
GenericObject 
(G) <>f__AnonymousType0`2[[System.String, mscorlib], [System.String, mscorlib]], query_oqabew 
GenericObject 
(G) <>f__AnonymousType0`2[[System.String, mscorlib], [System.String, mscorlib]], query_cfvuva 

Поддерживается ли этот вариант использования db4o?Как я могу аккуратно извлечь объекты из базы данных?

1 Ответ

1 голос
/ 10 февраля 2011

Анонимные типы официально не поддерживаются db4o, поэтому используйте его с осторожностью.

В вашем примере кода есть две проблемы:

  1. Использование анонимных типов
  2. Доступ к объектам из разных сборок

Что касается 1, к сожалению, для использования LINQ db4o требует, чтобы вы имели возможность ссылаться на тип в вашем коде (чего нельзя при использовании анонимных типов),Альтернативой может быть использование SODA (обратите внимание, что приведенный ниже пример кода работает только в том случае, если код, который хранит / извлекает объекты, живет в той же сборке)

using System;
using Db4objects.Db4o;

namespace TestAnonymousTypes
{
    class Program
    {
        static void Main(string[] args)
        {
            var obj = new {Name = "Foo", Id = "Bar"};

            if (args.Length == 0)
            {
                using (var db = Db4oEmbedded.OpenFile("TestAnonymous.odb"))
                {
                    db.Store(obj);
                }
                return;
            }

            using (var db = Db4oEmbedded.OpenFile("TestAnonymous.odb"))
            {
                var query = db.Query();
                query.Constrain(obj.GetType());

                var result = query.Execute();

                var y = result[0];
                Console.WriteLine(y);
            }
        }
    }
}

Возможно, будет возможно расширить реализацию LINQ для db4o.чтобы можно было указать тип динамически (но я не уверен).

Что касается 2, в вашем примере вы пытались использовать ключевое слово dynamic .Как я объяснял ранее, для db4o необходимо указать фактический тип в выражении LINQ, поэтому использование dynamic не будет работать.Вместо этого вы можете использовать SODA, но, поскольку db4o сохраняет имя сборки (рядом с именем класса) при хранении объектов, это не будет работать, если у вас две разные сборки (так как анонимные типы будут определены в разных сборках).

Решением для 2 будет иметь общую сборку (которая определяет вашу модель) или игру с псевдонимами.

Best

Adriano

...