【问题标题】:How to retrieve objects of an anonymous type from db4o如何从 db4o 中检索匿名类型的对象
【发布时间】:2011-02-09 14:24:44
【问题描述】:

我想将匿名类型的对象存储到 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 是否支持这个用例?我怎样才能将对象整齐地从数据库中取出?

【问题讨论】:

    标签: .net database c#-4.0 anonymous-types


    【解决方案1】:

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

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

    1. 使用匿名类型
    2. 访问来自不同程序集的对象

    关于 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,在您的示例中,您尝试使用 dynamic 关键字。正如我之前解释的,db4o 需要在 LINQ 表达式中指定实际类型,因此使用 dynamic 将不起作用。您可以改用 SODA,但是由于 db4o 在存储对象时存储了程序集名称(与类名一起),因此如果您有两个不同的程序集(因为匿名类型将在不同的程序集中定义),这将不起作用。

    2 的解决方案是使用通用程序集(定义您的模型)或使用别名。

    最好的

    阿德里亚诺

    【讨论】:

      猜你喜欢
      • 2013-08-02
      • 2013-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多