我正在使用 NDatabase 来做一些非常简单的对象存储——基本上是构建一个持久的工作队列。计划是创建一组对象,将它们保存到磁盘,然后按其中一个属性排序读取它们。我无法让“排序”部分工作 - NDatabase 引发异常。
这是我要保留的对象的超类型:
public abstract class Instruction: IComparable, IComparable<Instruction>
{
public virtual DateTime Timestamp
{
get;
set;
}
public int CompareTo(Instruction other)
{
if (this.Timestamp.Equals(other.Timestamp))
return 0;
return (this.Timestamp < other.Timestamp) ? -1 : 1;
}
public int CompareTo(object obj)
{
var other = obj as Instruction;
return other == null ? -1 : this.CompareTo(other);
}
}
这是我创建对象存储的方式:
using (var odb = OdbFactory.Open(storeName))
{
odb.IndexManagerFor<Instruction>().AddIndexOn("TimestampIndex", "Timestamp");
foreach (var instruction in instructions)
{
odb.Store(instruction);
}
odb.IndexManagerFor<Instruction>().RebuildIndex("TimestampIndex");
}
以下是稍后检索商店的方式:
lock (this.odb)
{
var q = odb.Query<T>();
q.Descend("Timestamp").OrderAscending();
var objectSet = q.Execute<T>(true, 0, maxCount);
instructions = objectSet.ToList();
foreach (var instruction in instructions)
{
odb.Delete(instruction);
}
odb.IndexManagerFor<Instruction>().RebuildIndex("TimestampIndex");
odb.Commit();
}
NDatabase.Exceptions.OdbRuntimeException
这会引发ToList()
通话。挖掘异常属性会给出消息
“NDatabase 已引发异常错误:222:不支持操作:CopyTo”
但是,如果我注释掉该行,q.Descend("Timestamp").OrderAscending();
那么它可以正常工作 - 尽管它显然没有被订购。
任何人都可以帮助阐明这一点吗?