Доброго времени суток!
Возможно то, чего я хочу — извращение. Но, по-моему, может быть полезной фичей.
Можно ли средствами 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) И. Ефремов