2015-01-09 3 views
1

Я использую NDatabase для создания действительно простого хранилища объектов - в основном, для создания постоянной рабочей очереди. План состоит в том, чтобы создать набор объектов, перенести их на диск, а затем прочитать их обратно, отсортированные по одному из свойств. Я не могу получить «отсортированную» часть работы - 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 has thrown an Exception Error:222:Operation not supported : CopyTo"

Однако, если я закомментировать строку q.Descend("Timestamp").OrderAscending(); то она отлично работает - хотя это явно не заказывали.

Может ли кто-нибудь помочь пролить свет на это, пожалуйста?

+0

Какое исключение вызывает база данных ndatabase? –

+0

@SivaGopal Я редактировал вопрос с сообщением об ошибке исключения. – TarkaDaal

+0

извините, но odb.Query (); вернет IList , который не имеет метода Descend (string s) или что-то пропустил? Какая версия? – InferOn

ответ

5

Исключение говорит вам, что базовая реализация nБаза данных о ICollection<T> (AbstractBTreeCollection<T>) не поддерживает метод CopyTo(), который называется методом ToList() расширения LINQ, который вы используете.

Таким образом, возникает вопрос, почему это происходит только тогда, когда вы выполняете посредническую работу с использованием OrderByAscending, но не по результату Query напрямую?

Глядя на исходный код для nБаза данных, я могу понять, почему: http://ndatabase.codeplex.com/SourceControl/latest

if (_inMemory) 
{ 
    if (_query != null && _query.HasOrderBy()) 
     _result = new InMemoryBTreeCollection<T>(_query.GetOrderByType()); 
    else 
     _result = new SimpleList<T>(); 
} 
else 
{ 
    // result = new InMemoryBTreeCollection((int) nbObjects); 
    if (_query != null && _query.HasOrderBy()) 
     _result = new LazyBTreeCollection<T>(_storageEngine, _returnObjects); 
    else 
     _result = new LazySimpleListFromOid<T>(_storageEngine, _returnObjects); 
} 

В QueryResultAction<T>.Start():

  • Если у вас есть заказ, вы получаете экземпляр реализации AbstractBTreeCollection, который не поддерживает CopyTo.
  • Если у вас нет заказа, вы получите экземпляр SimpleList или LazySimpleListFromOid, которые поддерживают CopyTo.

Глядя в примеры для nБазы данных, они не ожидают вас позвонить ToList(): https://ndatabase.codeplex.com/wikipage?title=5-minutes-tutorial

Это довольно болезненный нюанс реализации. Вы можете поднять его как проблему с ними.

Смежные вопросы