Явно описать запрос SELECT (VIEW на уровне Linq) - возможно ли такое?
От: stomsky Россия  
Дата: 13.07.15 08:12
Оценка:
Доброго времени суток!

Возможно то, чего я хочу — извращение. Но, по-моему, может быть полезной фичей.
Можно ли средствами Linq2Db явно задать компоненты SELECT-запроса для выборки сущности (эдакий локальный View)?

Поясню на примере. Есть две таблицы: документы (Docs) и состояния (States).
Каждый документ может находиться в определенном состоянии.
Примерно так:
create table dbo.States
(
  StateID      int identity(1, 1) not null,
  DisplayText  varchar(50)        not null,
  ...
  constraint StatesPK primary key(StateID)
)
create table dbo.Docs
(
  DocID        int identity(1, 1) not null,
  StateID      int                not null,
  Number       varchar(10),
  Amount       decimal,
  ...
  constraint Docs_States_FK foreign key(StateID)
             references dbo.States(StateID)
  ...
)

На клиенте мне нужно получить результаты такого запроса:
select d.DocID, d.Number, d.Amount, s.StateID, s.DisplayText as StateText
from dbo.Docs   d,
     dbo.States s
where d.StateID = s.StateID

Этот результат я хочу поместить в массив объектов вот такого класса:
class DisplayDocs
{
  public int DocID { get; set; }
  public string Number { get; set; }
  public decimal Amount { get; set; }
  public int StateID { get; set; }
  public string StateText { get; set; }
}

Понятно, что сейчас можно на каждую таблицу БД (dbo.Docs и dbo.States) сгенерировать свой класс, а потом получить запрос для заполнения массива DisplayDocs путем Linq-овского INNER JOIN-а.
Но мне хотелось бы сделать немного иначе.
Хочу обвешать объявление класса DisplayDocs атрибутами, которые укажут генератору SQL-кода из каких компонентов должен состоять запрос.
Например так:
[FromSubquery = "dbo.Docs d, dbo.States s"]
[WhereSubquery = "d.StateID = s.StateID"]
class DisplayDocs
{
  [SelectSubquery = "d.DocID"]
  public int DocID { get; set; }
  [SelectSubquery = "d.Number"]
  public string Number { get; set; }
  [SelectSubquery = "d.Amount"]
  public decimal Amount { get; set; }
  [SelectSubquery = "s.StateID"]
  public int StateID { get; set; }
  [SelectSubquery = "s.DisplayText"]
  public string StateText { get; set; }
}

Зачем это надо: можно тонко затачивать текст SQL-запроса под возможности СУБД. Например, расставлять хинты.
Просто у меня в SELECT-запросах часто приходится штук по 10 и более таблиц "джойнить" по-всякому...
Сейчас на Linq2Db такое сделать можно?
Или все-таки я хочу странного и так делать не надо?
Красота — наивысшая степень целесообразности. (c) И. Ефремов
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.