Есть ли способ установить атрибут TableAttribute во время выполнения или ИЛИ способ переключения типов LINQ во время выполнения? - PullRequest
0 голосов
/ 08 февраля 2012

Я задал вопрос таким образом, потому что могу представить, что есть потенциально простое, но специфичное для Devart решение, но, возможно, также очень общее решение для любой подобной ситуации.

Я использую Devart LINQ To Oracle, и обычно вы создаете класс, подобный ItemX, в файле lqml во время разработки и указываете, какая таблица стоит за ним. Затем во время выполнения вы используете Table(Of ItemX) для запроса базы данных. Пока все хорошо.

Теперь у меня есть ситуация, когда у меня есть две идентичные таблицы, ItemX и ItemY, и мне нужно запрашивать одну или другую в зависимости от флага времени выполнения. Кроме этого, весь код идентичен, и я хочу сохранить его таким. Тем не менее, Table(Of ItemX) строго типизирован, и поэтому мне нужно иметь дублирующиеся версии всего, с единственным отличием, это тип данных.

Таким образом, конкретное решение для Devart: иметь один класс элементов с именем, просто, Item, но во время выполнения сделать что-то, чтобы Devart DataContext использовал другую вспомогательную таблицу. Тогда весь код использует базовый объект Item, но при сохранении в базе данных и из нее он знает, какую таблицу использовать. Есть ли способ сделать это?

Более общий подход заключается в том, чтобы подключить цепочку IQueryable таким образом, чтобы она использовала классы ItemX и ItemY внутри, но преобразовала все в базовый класс Item во внешних сигнатурах. Я не могу даже представить это достаточно ясно, чтобы сформулировать вопрос, хотя. Есть ли способ сделать это?

1 Ответ

0 голосов
/ 09 февраля 2012

Вы можете реализовать этот сценарий, создав вручную базовый класс (который не сопоставлен ни с одной таблицей) и два его «тривиальных» потомка (каждая сопоставлена ​​с одной из таблиц, с которыми вы работаете).

Точнее, должны быть выполнены следующие шаги:

  • создать модель с классом сущности, соответствующим любой из таблиц;
  • переместить этот класс сущности из сгенерированного кода в другое место;
  • удалить атрибут Table из этого класса;
  • (необязательно) переименуйте класс, например, в «ItemBase»;
  • объявить двух открытых потомков этого класса (например, ItemX и ItemY);
  • установить атрибут Table, указывающий на соответствующую таблицу для каждого из этих потомков;
  • удалите свойство ItemBases (возвращающее объект Devart.Data.Linq.Table; конечно, у него может быть другое имя) вашего класса DataContext и добавьте аналогичные свойства, возвращающие Table и Table.

Таким образом, это должно выглядеть как

namespace MyContext {

  public partial class ItemBase : INotifyPropertyChanging, INotifyPropertyChanged {
    ... // Generated code.
  }

  [Table(Name = @"ItemXs")]
  public partial class ItemX : ItemBase {}

  [Table(Name = @"ItemYs")]
  public partial class ItemY : ItemBase {}

  public partial class MyDataContext {

    public Devart.Data.Linq.Table<ItemX > ItemXs {
      get { return this.GetTable<ItemX>(); }
    }

    public Devart.Data.Linq.Table<ItemY> ItemYs {
      get { return this.GetTable<ItemY>(); }
    }
  }

}
...