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

时间:2011-02-09 14:24:45

标签: .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 (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 个答案:

答案 0 :(得分:1)

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

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

  1. 使用匿名类型
  2. 访问不同程序集中的对象
  3. 关于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的解决方案是使用通用程序集(定义模型)或使用别名进行播放。

    最佳

    阿德