2009-04-14 55 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) 

非常令人讨厌的行为......