内部加入亚音速

时间:2009-04-14 21:33:59

标签: subsonic inner-join

我正在尝试显示与输入到文本框中的姓氏相匹配的所有记录。 这需要“volID”列上的INNER JOIN,因为有2个表。

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

7 个答案:

答案 0 :(得分:3)

我遇到了类似的问题,并通过搜索“FROM子句中的错误文本具有相同的公开名称”和SubSonic 2.2来发现此页面。

无论如何,我想我会发布我的代码,它在Subsonic 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();

答案 1 :(得分:1)

我认为你的连接线需要颠倒过来。

.InnerJoin(PastAwardName.VolIDColumn, PastAwardType.VolIDColumn)

应该是

.InnerJoin(PastAwardType.VolIDColumn, PastAwardName.VolIDColumn)

答案 2 :(得分: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();
    }

答案 3 :(得分:0)

查询似乎正确,不确定问题是什么。

你可以通过创建一个简单的集合来重写它,然后将它绑定到网格视图,看看你是否得到了同样的错误?

您是否查看了此link?

答案 4 :(得分:0)

我认为我们已经在2.2中解决了这个问题 - 但我确实记得2.1中的修正案。您是否尝试过使用带有四个参数的InnerJoin的重载?

听起来你正在使用2.1 - 如果是这样你可以尝试2.2,因为我认为我们已经为此做了修复。另外 - InnerJoin有一些重载,你可以明确告诉它要加入哪些表和列。

答案 5 :(得分:0)

偶然发现了同样的问题。 问题是我不能(或至少不知道如何)在连接中定义第二个表中的列而不像Brett提到的那样构建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);

代替

答案 6 :(得分:0)

所以这个问题的解决方案相当烦人,但它确实有效。您的代码具有如下的join语句:

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

如果更改InnerJoin语句中的表顺序,以便from语句中的表是第二个而不是第一个,它将起作用。

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

非常烦人的行为......