内在加入Where表达的麻烦

时间:2009-11-17 14:44:49

标签: subsonic subsonic2.2 subsonic-active-record subsonic-select

我正在使用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 个答案:

答案 0 :(得分:2)

您是否有理由在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()

答案 1 :(得分:0)

.InnerJoin(“Partner p”)..哪里(“p.PartnerID”)?

我以前从未见过这个,所以我真的只是猜测。如果我只是愚蠢,请忽略我:p

答案 2 :(得分:0)

有两种方法可以用亚音速进行内连接。第一种方法是指定要链接的列,例如:

.InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)

如果已在SubSonic模型中设置了关系,则只需指定表,而无需指定列。看起来这就是你想要做的,但你没有正确的语法。您必须使用泛型,如下所示:

.InnerJoin<Partner>()

第二种方式是可取的,因为它更具可读性。但是,它仅在尝试使用您在From()函数中指定的表进行连接时才有效。在这种情况下它应该适合你。