.net 如何从db4o检索匿名类型的对象

.net 如何从db4o检索匿名类型的对象,.net,database,c#-4.0,anonymous-types,.net,Database,C# 4.0,Anonymous Types,我想将匿名类型的对象存储到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 (va

我想将匿名类型的对象存储到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(3项)
一般对象
(G) f__匿名类型0`2[[System.String,mscorlib],[System.String,mscorlib]],查询
一般对象
(G) f__匿名类型0`2[[System.String,mscorlib],[System.String,mscorlib]],查询
一般对象
(G) f__匿名类型0`2[[System.String,mscorlib],[System.String,mscorlib]],查询

db4o支持这个用例吗?如何将对象整齐地从数据库中取出?

db4o不正式支持匿名类型,因此请谨慎使用

在示例代码中,您有两个问题:

  • 使用匿名类型
  • 从不同程序集访问对象
  • 关于1,不幸的是,为了使用LINQ db4o,确实需要您能够在代码中引用该类型(在使用匿名类型时您不能这样做)。另一种方法是使用SODA(注意,下面的示例代码仅在存储/检索对象的代码位于同一程序集中时有效)

    也许可以扩展db4o LINQ实现以允许动态指定类型(但我不确定)

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

    2的解决方案是使用一个公共程序集(定义模型)或使用别名

    最好的

    阿德里亚诺

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