2011-02-09 13 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に)提供しますthis:

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. 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の実装を拡張することが可能であろう(保存/コードは、オブジェクトを取得する場合にのみ、ノートを、サンプルコード怒鳴るは同じアセンブリに住んで動作します) 1つは動的に型を指定します(しかし、わかりません)。

    2については、動的キーワードを使用しようとしました。前に説明したように、db4oはLINQ式で実際の型を指定する必要があるので、動的を使用すると動作しません。 SODAを使用することもできますが、db4oはオブジェクトを格納するときにアセンブリ名(クラス名の横に)を格納するため、2つの異なるアセンブリがある場合(匿名型は異なるアセンブリで定義されるため)、動作しません。

    解決策2には、共通のアセンブリ(モデルを定義する)または別名で再生することがあります。

    ベスト

    アドリアーノ