db4o - как запросить общий интерфейс - PullRequest
0 голосов
/ 24 февраля 2012

Я нигде не нашел, можно ли запросить у Db4o все объекты, реализующие какой-то универсальный интерфейс

например: чтобы запросить все объекты, реализующие IList<T>, я попытался:

var items = from IList<object> item in session
            select item;

но это не возвращает все списки в базе данных (только те, которые реализуют специфически IList<object>)

Есть ли способ сделать это иначе, чем запрашивать все объекты из базы данных, зацикливать их и оценивать объект вручную? (В этом случае мне пришлось бы пройти через миллионы объектов)

Спасибо

1 Ответ

1 голос
/ 24 февраля 2012

Вы хотите запросить все объекты, которые являются экземплярами типа IList <>. Или другие костюмы универсального типа.

На мой взгляд, в данный момент это невозможно. Причина в том, что db4o рассматривает каждый экземпляр List <> как свой собственный тип. Таким образом, список и список хранятся двух разных типов. Это относится к хранилищу метаданных в db4o, где они хранятся отдельно. Это также означает, что не существует общего индекса для всех экземпляров различных типов List <>.

Между прочим, в Java все наоборот, все типы List <> обрабатываются как один и тот же тип, поскольку универсальные шаблоны Java не отражаются во время выполнения.

Итак, вам, в основном, нужно самостоятельно просмотреть все различные типы List <>, чтобы получить все экземпляры.

Для ваших собственных типов я бы создал абстрактный неуниверсальный класс, который наследует обобщенный экземпляр. Затем вы можете запросить это и получить все общие подтипы. Обратите внимание, что это не работает для интерфейсов, поскольку db4o не индексирует и не сохраняет мета-информацию для интерфейсов.

...