2009-04-14 6 views
2

Я пытаюсь отобразить все записи, соответствующие последней фамилии, введенной в текстовое поле. Для этого требуется INNER JOIN в столбце «volID», потому что есть 2 таблицы.Inner Join with Subsonic

<asp:TextBox ID="lName" runat="server"></asp:TextBox> 
<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="true" Visible="true"></asp:GridView> 
<asp:linkButton ID="btnSubmit" runat="server" onclick="btnSubmit_Click" /> 

код позади:

protected void btnSubmit_Click(object sender, EventArgs e) 
    { 
      GridView1.DataSource = new Select("*") 
      .From(PastAwardName.Schema) 
      .InnerJoin(PastAwardName.VolIDColumn, PastAwardType.VolIDColumn) 
      .Where(PastAwardName.Columns.LName).IsEqualTo(this.lName.Text) 
      .ExecuteReader(); 

      GridView1.DataBind(); 
    } 

Я пытался сделать это с и пример на Subsonics сайте, но не может получить его работу. Исправлена ​​ошибка ниже.

Server Error in '/' Application. 
________________________________________ 
The objects "dbo.pastAwardNames" and "dbo.pastAwardNames" in the FROM clause have the same exposed names. Use correlation names to distinguish them. 
Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code. 

Exception Details: System.Data.SqlClient.SqlException: The objects "dbo.pastAwardNames" and "dbo.pastAwardNames" in the FROM clause have the same exposed names. Use correlation names to distinguish them. 

Source Error: 

Line 30: 
Line 31: 
Line 32:   GridView1.DataSource = new Select("*") 
Line 33:    .From(PastAwardName.Schema) 
Line 34:    .InnerJoin(PastAwardName.VolIDColumn, PastAwardType.VolIDColumn) 
+0

Где/как определяется второй таблицы? Из ошибки видно, что он пытается присоединиться к той же самой таблице. – geofftnz

+0

PastAwardName - это первая таблица. PastAwardType - это вторая таблица. Я пытаюсь присоединиться к столбцу volID. – Brett

ответ

0

Запрос кажется правильным, не уверен, в чем проблема.

Можете ли вы переписать его, создав простую коллекцию, а затем привяжите ее к виду сетки и посмотрите, получаете ли вы такую ​​же ошибку?

ли Вы проверить это link?

+0

Это прекрасно работает, но использует только один стол. Не знаете, как добавить соединение? GridView1.DataSource = новый запрос (CMS.PastAwardName.Schema) .WHERE (PastAwardName.Columns.LName, this.lName.Text) .ExecuteReader(); – Brett

+0

Есть 2 таблицы: PastAwardName, PastAwardType PastAwardName: VolID, Fname, LName, район PastAwardType: VolID, awardName, awardYear, awardType – Brett

+0

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

0

Я думаю, что мы зафиксировали это в 2.2 - но я действительно вспомнить исправление в 2.1, а также. Вы пытались использовать перегрузку для InnerJoin, которая берет четыре параметра?

Похоже, вы используете 2.1 - если это так, вы можете попробовать 2.2, поскольку я думаю, что у нас есть исправление для этого. Также - InnerJoin имеет некоторые перегрузки, где вы можете явно указать, к каким таблицам и столбцам присоединиться.

+0

Версия 2.1. Я новичок в Subsonic и не уверен, что вы имеете в виду. – Brett

1

Я думаю, что ваша линия соединения должна быть отменена.

.InnerJoin(PastAwardName.VolIDColumn, PastAwardType.VolIDColumn) 

должен быть

.InnerJoin(PastAwardType.VolIDColumn, PastAwardName.VolIDColumn) 
1

Спасибо за ответы. В настоящее время он работает с использованием следующего кода:

private void BuildGridView1() 
    { 
     GridView1.DataSource = new Select(PastAwardName.Schema.TableName + ".*", PastAwardType.Schema.TableName + ".*") 
       .From(PastAwardName.Schema) 
       .InnerJoin(PastAwardType.Schema.TableName, PastAwardType.Columns.VolID, PastAwardName.Schema.TableName, PastAwardName.Columns.VolID) 
       .Where(PastAwardName.Columns.LName).Like(this.txtSearchName.Text) 
       .OrderAsc(PastAwardType.Columns.AwardYear) 
       .ExecuteDataSet(); 
    } 

    protected void GridView1_PageIndexChanging(object sender, GridViewPageEventArgs e) 
    { 
     BuildGridView1(); 
     GridView1.PageIndex = e.NewPageIndex; 
     GridView1.DataBind(); 
    } 
0

Просто наткнулся на ту же проблему. Проблема заключается в том, что я не могу (или, по крайней мере, не знаю, как), чтобы определить столбцы из второй таблицы в объединение без построения selectpart как Бретт упоминается

DB.Select(Table1.Schema.TableName + "." + Table1.Columns.Id, 
      Table1.Schema.TableName + "." + Table1.Columns.Name, 
      Table2.Schema.TableName + "." + Table2.Columns.Caption 
     ).From<Table1>() 
      .LeftOuterJoin(Table2.Table1_IdColumn, Table1.IdColumn); 

работы, но было бы СВАО в использовать

DB.Select(Table1.IdColumn, Table2.CaptionColumn) 
    .From<Table2>() 
    .LeftOuterJoin(Table2.Table1_IdColumn, Table1.IdColumn); 

вместо

3

у меня была аналогичная проблема с этим, и обнаружил эту страницу с помощью поиска по тексту ошибки «в ЕКОМ имеют те же открытые имена» и дозвуковых 2.2.

Во всяком случае, я думал бы разместить свой код, который отлично работает в дозвуковом 2.2 и выглядит довольно чистыми ..

Надежда кто-то считает его полезным, как это было мне чесать голова на некоторое время !!

IDataReader reader = new SubSonic.Select(CityMapping.MasterCityColumn, CityMapping.ChildCityColumn, CityMappingTourType.TourTypeCodeColumn) 
       .From<CityMapping>() 
       .InnerJoin(CityMappingTourType.CityMappingIDColumn, CityMapping.IdColumn) 
       .OrderAsc(CityMapping.Columns.MasterCity, CityMapping.Columns.ChildCity, CityMappingTourType.Columns.TourTypeCode) 
       .ExecuteReader(); 
0

Таким образом, решение этой проблемы довольно раздражает, но оно работает.Ваш код имеет заявление присоединиться так:

.From(PastAwardName.Schema) 
.InnerJoin(PastAwardName.VolIDColumn, PastAwardType.VolIDColumn) 

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

.From(PastAwardName.Schema) 
.InnerJoin(PastAwardType.VolIDColumn, PastAwardName.VolIDColumn) 

Очень раздражает поведение ...