SubSonic 2.1: нужно объяснение SqlQuery.ExecuteJoinedDataSet () - PullRequest
0 голосов
/ 15 сентября 2009

У меня есть SqlQuery, который выглядит так:

            SqlQuery query = 
            DB.Select(
               Order.Schema.TableName + ".*",
               OrderDetail.Schema.TableName + ".*")
                .From<Order>()
                    .InnerJoin<OrderDetail>()
            .Where(Order.IdColumn).IsEqualTo(1);

Теперь я ожидаю, что метод SqlQuery.ExecuteJoindDataSet () сгенерирует для меня DataSet, который содержит 2 DataTables (один для Orders, один для OrderDetails) и поместит DataRelation в DataSet, поэтому мне не нужно делать все это вручную.

Но ExecuteJoinedDataSet () генерирует только одну таблицу, содержащую все данные из Order, но не из OrderDetail:

    // Order = 104 Columns
    // OrderDetail = 74 Columns
    query.ExecuteJoinedDataSet().Tables.Count => 1
    query.ExecuteJoinedDataSet().Tables[0].Columns.Count => 104
    query.ExecuteDataSet().Tables[0].Columns.Count => 177

Я думаю, что я на правильном пути, но может кто-нибудь сказать, пожалуйста, что я делаю не так?

Целью этого является то, что компонент печати, который я использую в своем проекте, не принимает универсальные объекты, но DataSet использует в качестве источника данных.

1 Ответ

1 голос
/ 16 сентября 2009

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

Так что для этой схемы

create table tblBaseType
(
id int not null primary key identity(1,1),
name not null varchar(100) unique
)

create table tblBaseLocation
(
id int not null primary key identity(1,1),
name not null varchar(100) unique
)

create table tblBase
(
id int not null primary key identity(1,1),
name varchar(100) not null unique,
baseTypeID int not null references tblBaseType(id),
baseLocationID int null references tblBaseLocation(id)
)

и SqlQuery, как

SqlQuery q = new Select().From(TblBase.Schema).Where(TblBase.IdColumn).IsEqualTo(1);
DataSet ds = q.ExecuteJoinedDataSet();

будет генерироваться этот приблизительный sql:

select tblBase.Id,
tblBase.Name,
tblBaseType.Name as baseTypeId,
tblBaseLocation.name as baseLocationId
from tblBase
inner join tblBaseType on tblBase.baseTypeID = tblBaseType.id
left join tblBaseLocation on tblBase.baseLocationID = tblBaseLocation.id

Фактический sql полностью квалифицирован, это приблизительное приближение с нуля.

...