InnerJoin с проблемой «Где выражение» - PullRequest
0 голосов
/ 17 ноября 2009

Я использую Subsonic 2.1, мне нужно выполнить внутреннее соединение и использовать выражение where, и я продолжаю получать сообщение об ошибке:

Must declare the scalar variable "@Partner"

Вот мой код:

Dim ds As DataSet = UWP.Model.DB.Select("TOP 30 FirstName, LastName, EmailAddress, CustomerRowID, CompanyName")
 .From("Customer").InnerJoin("Partner")
     .Where("Partner.PartnerID").IsEqualTo("Customer.PartnerID")
 .WhereExpression("FirstName").Like("%" & SearchTerm & "%")
     .Or("LastName").Like("%" & SearchTerm & "%")
     .Or("EmailAddress").Like("%" & SearchTerm & "%")
 .CloseExpression()
 .ExecuteDataSet()

Я попытался перестроить эту штуку с помощью 10 разных способов и просто не могу понять, как это правильно.

Ответы [ 3 ]

2 голосов
/ 18 ноября 2009

Существует ли причина, по которой вы задаете критерии объединения в предложении where вместо самого соединения?

Я переписал ваш запрос, чтобы воспользоваться строго типизированными именами столбцов, что вы должны делать всякий раз, когда это возможно, поскольку вы можете обнаруживать проблемы во время компиляции, а не во время выполнения. Кроме того, используйте .ContainsString () вместо этого сцепленного gobblydegook для лучшей читаемости.

Dim ds As DataSet = UWP.Model.DB.Select("TOP 30 FirstName, LastName, EmailAddress, CustomerRowID, CompanyName")
 .From(Customer.Schema)
  .InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)
  .Where(Customer.FirstNameColumn).ContainsString(SearchTerm)
  .Or(Customer.LastNameColumn).ContainsString(SearchTerm)
  .Or(Customer.EmailAddressColumn).ContainsString(SearchTerm)
 .ExecuteDataSet()

Или, чтобы использовать свой оригинальный код, просто используйте перегрузку из четырех строк внутреннего соединения и укажите там столбцы. Я думаю, что вы попадаете в тупик, пытаясь выполнить объединение в предложении where, когда вам это не нужно.

Dim ds As DataSet = UWP.Model.DB.Select("TOP 30 FirstName, LastName, EmailAddress, CustomerRowID, CompanyName")
 .From("Customer")
 .InnerJoin("Partner","PartnerID","Customer","PartnerID")
 .Where("FirstName").Like("%" & SearchTerm & "%")
     .Or("LastName").Like("%" & SearchTerm & "%")
     .Or("EmailAddress").Like("%" & SearchTerm & "%")
 .ExecuteDataSet()
0 голосов
/ 19 ноября 2009

Есть 2 способа сделать внутреннее соединение с дозвуковым. Первый способ - указать столбцы для ссылки, например:

.InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)

Если отношения уже установлены в вашей модели SubSonic, вы можете просто указать таблицу, не указывая столбцы. Похоже, это то, что вы пытались сделать, но у вас не совсем правильный синтаксис. Вы должны использовать дженерики, как это:

.InnerJoin<Partner>()

Второй способ предпочтительнее, потому что он более читабелен. Однако он работает только при попытке объединения с таблицей, указанной в функции From (). Это должно работать для вас в этой ситуации.

0 голосов
/ 17 ноября 2009

.InnerJoin ("Партнер p") .. Где ("p.PartnerID")?

Я никогда не видел этого раньше, так что я просто догадываюсь. Так что игнорируйте меня, если я просто глупый: p

...