2009-05-21 6 views
0

j'aimerais obtenir l'instruction SQL suivante avec subsonique 2,2Effectuez une seule sélection avec laquelle

SELECT Product.* FROM Product WHERE Product.OurPrice <> Product.RetailPrice 

La requête de sélection Subsonic J'ai commencé avec:

SubSonic.SqlQuery select = new SubSonic.Select() 
.From<Product>() 
.Where(Product.Columns.OurPrice) 
.IsNotEqualTo(... object /*Should be Product.Columns.RetailPrice, but that's giving and exception*/...); 

Ma question est de savoir comment Dites à SubSonic 2.2 de générer une condition where avec une autre colonne dans la même table.

+0

Quelle exception obtenez-vous? –

+0

L'exception (extrait) est [FormatException: chaîne d'entrée était pas dans un format correct.] System.Number.StringToNumber (String str, options NumberStyles, NumberBuffer et numéro, informations NumberFormatInfo, Boolean parseDecimal) 7469351 ... [FormatException: Echec de la conversion de la valeur du paramètre d'une chaîne en une décimale.] System.Data.SqlClient.SqlParameter.CoerceValue (Valeur de l'objet, MetaType destinationType) +4872143 ... [SqlQueryException: Echec de la conversion de la valeur du paramètre Chaîne à une décimale.] SubSonic.SqlQuery.ExecuteReader() +57 SubSonic.SqlQuery.ExecuteAsCollection() +80 – csizo

+0

Quels sont les types de colonnes sur vos prix? Pourraient-ils avoir des données non numériques présentes ou '$'? –

Répondre

0

Il semble que vous essayiez de comparer deux colonnes dans votre requête. Ce n'est pas possible SubSonic 2.2 sauf si vous utilisez une requête en ligne:

http://subsonicproject.com/docs/Inline_Query_Tool

Vous pouvez aussi éventuellement utiliser une vue ou d'une table fonction en fonction.

+0

La requête en ligne fonctionnait. Dommage qu'il n'y ait pas d'autre option que du SQL pur. Au moins ça marche! Merci. – csizo

0

La solution pour le problème ci-dessus:

ProductCollection products = new SubSonic.InlineQuery().ExecuteAsCollection<ProductCollection> 
(@"SELECT Product.ProductId, ... Product.ModifiedBy, Product.ModifiedOn, Product.IsDeleted FROM Product WHERE (Product.OurPrice <> Product.RetailPrice)"); 

Repeater1.DataSource = products; 
Repeater1.DataBind(); 
0

Vous pouvez utiliser l'ancien objet de la requête (toujours inclus dans 2.2) comme ceci:

Query q = new Query(Product.Schema.TableName).WHERE("OurPrice <> RetailPrice"); 
ProductCollection products = new ProductCollection(); 
products.LoadAndCloseReader(q.ExecuteReader()); 
+0

Où retourne une contrainte pas une SqlQuery pour que le code ne fonctionne malheureusement pas. –

+0

Désolé, je pensais à l'ancien objet Query. J'ai mis à jour ma réponse avec le bon exemple –

Questions connexes