Subsonic 2.2 Связывание соединенных столбцов таблицы с сеткой - PullRequest
1 голос
/ 16 ноября 2010

Я все еще достаточно новичок в дозвуке и нахожу самые простые вещи немного хитрыми.У меня есть простой запрос, который объединяет две таблицы: Профиль и Подписка.

  ProfileCollection profiles =
            new Select().From<Profile>()
                .InnerJoin(Subscription.ProfileIdColumn,Profile.ProfileIDColumn )
                .Where(Subscription.ExpiryDateColumn).IsLessThan(Date)
                .ExecuteAsCollection <ProfileCollection > ();
        return profiles;

Я хочу отобразить следующие столбцы в моей сетке: Profile.Name и Subscription.ExpiryDate и, возможно, несколько других.

Ранее я использовал LLBLGen, и я мог сделать что-то вроде (обратите внимание, что это псевдокод):

<repeater>    
<itemitemplate>

<%#Eval("Name")%>
<%#Eval("Subscription.ExpiryDate")%>  
</itemitemplate>   

</repeater>

Но я получаю ошибку что-то вроде

Подписка не является членом профиля.

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

     ProfileCollection profiles =
                new Select(Subscription.ExpiryDateColumn.PropertyName,
Profile.NameColumn.PropertyName).From<Profile>()
                    .InnerJoin(Subscription.ProfileIdColumn,Profile.ProfileIDColumn )
                    .Where(Subscription.ExpiryDateColumn).IsLessThan(Date)
                    .ExecuteAsCollection <ProfileCollection > ();
            return profiles;

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

Может кто-нибудь сказать мне, что я пропускаю, илидайте мне знать, как лучше связать строки соединенных таблиц с сетками с дозвуковым эффектом?

Мое решение Хорошо, из приведенных ниже ответов, я должен сделать следующее: У меня естьиспользуется *, чтобы я мог вернуть все строки

 Dataset profiles =
                new Select("Subscription.*","Profile.*").From<Profile>()
                    .InnerJoin(Subscription.ProfileIdColumn,Profile.ProfileIDColumn )
                    .Where(Subscription.ExpiryDateColumn).IsLessThan(Date)
                    .ExcecuteDataset();
            return profiles;

В моей сетке теперь я могу связать <% # Eval ("Name")%> из таблицы профиля и <% # Eval (Subscription.ExpiryDate ")%> от подписки на мою сетку

Есть еще предложения? Несмотря на то, что вышеперечисленное работает, я недоволен использованием "Подписка. ", "Профиль. " вПри выборе, я бы предпочел использовать некоторые строго типизированные значения, если что-то меняется, поэтому я получаю ошибки компиляции, а не просто сбой при попытке выполнить запрос!

Спасибо

Bex

1 Ответ

0 голосов
/ 16 ноября 2010

Вам нужно взглянуть на SubSonic Query Tool для выполнения объединений, прикрепленная ссылка имеет много примеров, которые должны помочь.Если вам нужно выполнять сложные объединения с SubSonic, я предлагаю вам переместить логику в хранимую процедуру.Ниже будет создан запрос, который возвращает список столбцов в методе Select ().

Пример:

SqlQuery q = new Select(Subscription.ExpiryDateColumn.PropertyName, Profile.NameColumn.PropertyName).From<Profile>()
                    .InnerJoin(Subscription.ProfileIdColumn,Profile.ProfileIDColumn )
                    .Where(Subscription.ExpiryDateColumn).IsLessThan(Date);

DataTable dt = q.ExecuteDataSet().Tables[0];
...