Извършете единичен избор с where

Бих искал да постигна следния SQL израз с subsonic 2.2

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

Subsonic select query, с който започнах:

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*/...);

Въпросът ми е как да кажа на SubSonic 2.2 да генерира условие where срещу друга колона в същата таблица.


person csizo    schedule 21.05.2009    source източник
comment
Изключението (фрагмент) е [FormatException: Входящият низ не беше в правилен формат.] System.Number.StringToNumber(String str, NumberStyles options, NumberBuffer& number, NumberFormatInfo info, Boolean parseDecimal) +7469351 ... [FormatException: Failed to конвертиране на стойност на параметър от низ в десетична.] System.Data.SqlClient.SqlParameter.CoerceValue(Стойност на обект, MetaType destinationType) +4872143 ... [SqlQueryException: Неуспешно преобразуване на стойност на параметър от низ в десетична.] SubSonic. SqlQuery.ExecuteReader() +57 SubSonic.SqlQuery.ExecuteAsCollection() +80   -  person csizo    schedule 21.05.2009
comment
Какви са типовете колони на вашите цени? Може ли да имат налични нечислови данни или '$'?   -  person Christian Loris    schedule 21.05.2009
comment
Типовете колони са десетични и в двете колони.   -  person csizo    schedule 21.05.2009


Отговори (3)


Изглежда, че се опитвате да сравните две колони в заявката си. Това не е възможно в SubSonic 2.2, освен ако не използвате вградена заявка:

http://subsonicproject.com/docs/Inline_Query_Tool

Можете също така евентуално да използвате функция, базирана на изглед или таблица.

person Adam Cooper    schedule 21.05.2009
comment
Вградената заявка работеше. Жалко, че няма друг вариант само чист SQL. Поне работи! Благодаря. - person csizo; 21.05.2009

Решението на горния проблем:

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();
person csizo    schedule 21.05.2009

Можете да използвате стария обект Query (все още включен във 2.2) така:

Query q = new Query(Product.Schema.TableName).WHERE("OurPrice <> RetailPrice");
ProductCollection products = new ProductCollection();
products.LoadAndCloseReader(q.ExecuteReader());
person John Sheehan    schedule 21.05.2009
comment
Where връща ограничение, а не SqlQuery, така че кодът няма да работи за съжаление. - person Adam Cooper; 22.05.2009
comment
Съжалявам, мислех за стария обект на Query. Актуализирах отговора си с правилния пример - person John Sheehan; 22.05.2009