我想将匿名类型的对象存储到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是否支持此用例?我怎么能把对象整齐地从数据库中拿出来?
答案 0 :(得分:1)
db4o不正式支持匿名类型,因此请谨慎使用。
在您的示例代码中,您有两个问题:
关于1,遗憾的是,为了使用LINQ,db4o确实要求您能够引用代码中的类型(使用匿名类型时不能这样)。另一种方法是使用SODA(注意,仅当存储/检索对象的代码存在于SAME程序集中时,示例代码才会起作用)
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);
}
}
}
}
也许可以扩展db4o LINQ实现以允许动态指定类型(但我不确定)。
关于2,在您的示例中,您尝试使用动态关键字。正如我之前解释的那样,db4o需要在LINQ表达式中指定实际类型,因此使用动态将不起作用。您可以使用SODA,但由于db4o在存储对象时存储程序集名称(与类名一起),如果您有两个不同的程序集,这将无效(因为匿名类型将在不同的程序集中定义)。
2的解决方案是使用通用程序集(定义模型)或使用别名进行播放。
最佳
阿德