2011-02-09 82 views
0

我想将匿名类型的对象存储到db4o数据库中。例如:如何从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

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); 
      } 
     } 
    } 
} 

也许这将有可能延长db4o的LINQ实现允许一个动态地指定类型(但我不确定)。

关于2,在您的示例中,您尝试使用动态关键字。如前所述,db4o需要在LINQ表达式中指定实际类型,因此使用动态将不起作用。您可以改用SODA,但是由于db4o在存储对象时存储了程序集名称(与类名称一起),所以如果您有两个不同的程序集(因为匿名类型将在不同的程序集中定义),这将不起作用。

对于2的解决方案将有一个共同的程序集(它定义您的模型)或玩混淆。

最佳

阿德里亚诺