Внутреннее соединение с Subsonic - PullRequest
2 голосов
/ 15 апреля 2009

Я пытаюсь отобразить все записи, которые соответствуют фамилии, введенной в текстовое поле. Это требует ВНУТРЕННЕГО СОЕДИНЕНИЯ для столбца «volID», потому что есть 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 ]

3 голосов
/ 16 февраля 2011

У меня была похожая проблема с этим, и я обнаружил эту страницу, выполнив поиск по тексту ошибки «в предложении 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 голос
/ 28 апреля 2009

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

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();
    }
1 голос
/ 15 апреля 2009

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

.InnerJoin(PastAwardName.VolIDColumn, PastAwardType.VolIDColumn)

должно быть

.InnerJoin(PastAwardType.VolIDColumn, PastAwardName.VolIDColumn)
0 голосов
/ 21 сентября 2011

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

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

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

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

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

0 голосов
/ 11 мая 2009

Просто наткнулся на ту же проблему. Проблема в том, что я не могу (или, по крайней мере, не знаю, как) определить столбцы из второй таблицы в объединении, не создавая 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);

вместо

0 голосов
/ 15 апреля 2009

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

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

0 голосов
/ 15 апреля 2009

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

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

Вы проверили эту ссылку?

...