我使用DB4O
来存储我的对象。请从DBO4 DB中找到以下代码to retrieve objects
。
public IList<T> GetList<T>()
{
IList<T> list = null;
using (IObjectContainer db = Db4oEmbedded.OpenFile(Db4oEmbedded.NewConfiguration(), fullFilePath))
{
list = db.Query<T>(typeof(T));
}
return list;
}
问题是,我不能在使用块之外应用C#'foreach'循环。它给了我一个错误“抛出类型'Db4objects.Db4o.Ext.DatabaseClosedException'的异常。”一旦我开始遍历我的列表outside of Using block
我能够使用块,来应用C#'foreach'循环,但我想将我的通用列表用于另一个代码层。所以,我必须要我的使用块之外的通用列表对象。
请给我解决方案。
提前致谢。
答案 0 :(得分:3)
只需添加'Femaref'答案&amp;注释:
1)是的,您需要为每个连接添加新配置。 2)打开数据库需要一段时间。 db4o需要读取元数据,检查事务是否已完成等。
通常,您不应完全打开和关闭每个操作的容器。这需要花费大量时间来打开和关闭数据库。我想你想为每个操作使用一个新的对象容器来为每个操作创建一个事务。
我建议你稍微改变一下实现。应用程序启动时打开对象容器。关闭应用程序时关闭它。然后对每个操作使用session containers。这应该快得多,因为db4o不需要进行所有初始化工作。
像这样:
// Open the container once for the life-time of your application
IObjectConainer rootContainer = Db4oEmbedded.OpenFile(......)
public IList<T> GetList<T>()
{
using (IObjectContainer db = rootContainer.Ext().OpenSession())
{
// As Femaref said, use to list to 'eagerly' load all data
return db.Query<T>(typeof(T)).ToList();
}
}
答案 1 :(得分:1)
您有两种可能性:
ToList
),它会迭代IEnumerable<T>
并返回该数据。