2011-02-09 81 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的解決方案將有一個共同的程序集(它定義您的模型)或玩混淆。

最佳

阿德里亞諾