INNER JOIN con Dove guai Expression
-
20-09-2019 - |
Domanda
Sto usando Subsonic 2.1 e ho bisogno di fare un innerjoin e utilizzare un'espressione dove e continuo a ricevere l'errore:
Must declare the scalar variable "@Partner"
Qui è il mio codice:
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()
Ho cercato di ri-organizzare questa cosa circa 10 modi diversi e proprio non riesco a farlo bene.
Soluzione
C'è una ragione si specifica il join criteri nella clausola dove invece di nel join sé?
I ri-scritto la query per approfittare di nomi di colonne fortemente tipizzati, che si dovrebbe fare, quando possibile, perché è possibile individuare i problemi in fase di compilazione, invece di tempo di esecuzione. Inoltre, utilizzare .ContainsString () al posto di quella gobblydegook concatenati per una migliore leggibilità.
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()
In alternativa utilizzare il codice originale, basta usare il sovraccarico di quattro serie di join interno e specificare le colonne lì. Credo che tu stia ottenendo inciampato da cercando di fare il join nella clausola in cui quando non si ha realmente bisogno.
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()
Altri suggerimenti
.InnerJoin ( "Partner p") .. Dove ( "p.PartnerID")?
Non ho mai visto prima, quindi sono davvero solo indovinare. Quindi ignorare me, se sto solo di essere stupido: p
Ci sono 2 modi per fare un inner join con subsonico. Il primo modo è quello di specificare le colonne di collegare su, come ad esempio:
.InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)
Se le relazioni è già configurato nel modello subsonico, si può solo specificare il tavolo, senza dover specificare le colonne. Sembra che questo è quello che stavi cercando di fare, ma non ha avere la sintassi perfettamente ragione. È necessario utilizzare farmaci generici, in questo modo:
.InnerJoin<Partner>()
Il secondo modo è preferibile perché è più leggibile. Tuttavia, funziona solo quando si cerca di unirsi con la tabella che si specifica nella funzione da (). Dovrebbe funzionare per voi in questa situazione.