0

我正在使用 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 种不同的方式重新安排这件事,但似乎无法做到正确。

4

3 回答 3

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()
于 2009-11-18T08:45:05.363 回答
0

.InnerJoin("Partner p")..Where("p.PartnerID") ?

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

于 2009-11-17T14:57:48.180 回答
0

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

.InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)

如果关系已经在您的 SubSonic 模型中设置,您可以只指定表,而不必指定列。看起来这是您想要做的,但您的语法不太正确。您必须使用泛型,如下所示:

.InnerJoin<Partner>()

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

于 2009-11-19T13:31:58.887 回答