我正在使用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种不同的方式重新安排这个东西,但似乎无法做到正确。
答案 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()函数中指定的表进行连接时才有效。在这种情况下它应该适合你。