2009-04-14 46 views
2

我試圖顯示與輸入到文本框中的姓氏相匹配的所有記錄。 這需要在「volID」列上有一個INNER JOIN,因爲有兩個表。Inner Subsonic與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 2009-04-14 21:39:17

+0

PastAwardName是第一個表 - PastAwardType是第二個表。我正在嘗試加入volID專欄。 – Brett 2009-04-15 15:00:38

回答

0

查詢似乎是正確的,不知道是什麼問題。

您可以通過創建一個簡單的集合來重寫它,然後將其綁定到網格視圖並查看是否得到相同的錯誤?

你檢查出這個link?

+0

這工作正常,但只使用一個表。不知道如何添加連接? GridView1.DataSource = new Query(CMS.PastAwardName.Schema).WHERE(PastAwardName.Columns.LName,this.lName.Text).ExecuteReader(); – Brett 2009-04-15 14:49:37

0

我認爲,我們在2.2固定這一點 - 但我不記得在2.1補丁也是如此。你有沒有嘗試過使用InnerJoin的四個params參數?

聽起來像你正在使用2.1 - 如果是這樣,你可以嘗試2.2,因爲我認爲我們有一個解決這個問題的地方。此外 - InnerJoin有一些重載,您可以明確告訴它哪些表和列要加入。

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); 

的作品,但它會NEAD到使用

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

代替

3

我有一個類似的問題這一點,並通過在錯誤文本「在FROM子句中具有相同的名稱曝光」和亞音速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) 

非常令人討厭的行爲......