Анонимные типы официально не поддерживаются db4o, поэтому используйте его с осторожностью.
В вашем примере кода есть две проблемы:
- Использование анонимных типов
- Доступ к объектам из разных сборок
Что касается 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