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.

È stato utile?

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.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top