Pregunta

Estoy utilizando subsónico 2.1 y tengo que hacer un innerjoin y el uso de una expresión dónde y sigo obteniendo el error:

Must declare the scalar variable "@Partner"

Aquí está mi código:

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()

He tratado de re-organización de esta cosa alrededor de 10 formas diferentes y simplemente parece que no puede hacerlo bien.

¿Fue útil?

Solución

¿Hay alguna razón se especifica el criterio de combinación en la cláusula donde en lugar de en el juntarse?

Reescribí su consulta para tomar ventaja de nombres de columna inflexible, lo que usted debe hacer siempre que sea posible, ya que puede detectar los problemas en tiempo de compilación en lugar de tiempo de ejecución. Asimismo, el uso .ContainsString () en lugar de que gobblydegook concatenados para una mejor lectura.

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()

O, para usar su código original, sólo tiene que utilizar la sobrecarga de cuatro cuerdas de la combinación interna y especificar las columnas allí. Creo que te vas a tropezar al tratar de hacer la unión en la cláusula where cuando no es realmente necesario.

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()

Otros consejos

.InnerJoin ( "Socio p") .. Donde ( "p.PartnerID")?

Nunca he visto esto antes, así que estoy realmente sólo una suposición. Así que ignorar si yo estoy siendo estúpida: p

Hay 2 maneras de hacer una unión interna con subsónica. La primera forma es especificar las columnas de vincular en, por ejemplo:

.InnerJoin(Partner.PartnerIDColumn, Customer.PartnerIDColumn)

Si las relaciones ya está configurado en su modelo SubSonic, sólo puede especificar la tabla, sin tener que especificar las columnas. Parece que esto es lo que estaba tratando de hacer, pero que no tienen la sintaxis del todo bien. Debe utilizar los genéricos, así:

.InnerJoin<Partner>()

La segunda forma es preferible porque es más fácil de leer. Sin embargo, sólo funciona cuando se trata de unión con la tabla que se especifica en la función del (). Se debe trabajar para usted en esta situación.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top