Вызов функции SQL из Subsonic.Select

Я задал следующий вопрос на форуме по дозвуковой технологии, но, похоже, получил только один ответ, поэтому я подумал, что я тоже отправлю здесь, чтобы посмотреть, сможет ли кто-нибудь пролить еще немного света на проблему ...

Я хочу создать следующий оператор SQL через SubSonic, используя инструмент Select (или инструмент запроса) .. он использует специальную функцию под названием «SPLIT ()»:

ВЫБРАТЬ * ИЗ VwPropertyList
ГДЕ VwPropertyList.idCreatedBy = 123
И VwPropertyList.idCounty = 45
И 29 В (ВЫБРАТЬ элемент ИЗ СПЛИТА (DistrictGroupList, ','))

(последняя часть этого SQL использует функцию SPLIT)

Мой дозвуковой эквивалент выглядит следующим образом ...

Затемнить mySelect как новый SubSonic.Select
mySelect.From (VwPropertyList.Schema)
mySelect.Where (VwPropertyList.Columns.IdCreatedBy) .IsEqualTo (123)
mySelect.And (VwPropertyList.Columns. IdCounty) .IsEqualTo (45)
mySelect.And (29) .In (New SubSonic.Select ("Item"). From ("SPLIT (" & VwPropertyList.Columns.DistrictGroupList & ", ', ') "))

Это не работает из-за последней части ... как я могу добавить "AND 29 IN (SELECT Item FROM SPLIT (DistrictGroupList, ','))" в мой Subsonic.Select?

В ответе, который я получил от форума по дозвуковым технологиям, предлагалось отказаться от Subsonic.Select и заменить их жестко запрограммированными операторами InlineQuery () ... например:

Уменьшить размер SQL как String = "Select" & VwPropertyList.Columns.Item
SQL = SQL & "From" & VwPropertyList.Schema.TableName
SQL = SQL & "Where" & VwPropertyList.Columns.IdCreatedBy & " = @CreatedBy "
SQL = SQL &" And "& VwPropertyList.Columns.IdCounty &" = @County "
SQL = SQL &" And @DistrictGroup IN (Выбрать элемент из SPLIT (DistrictGroupList, ', ') "

Items = SubSonic.InlineQuery (). ExecuteTypedList (Of MyItem) (SQL, 123,45,29)

Я бы предпочел использовать SubSonic.Select, если это возможно, чтобы я мог воспользоваться функциями разбиения по страницам и т. Д.

Любые идеи?


person Community    schedule 30.03.2009    source источник


Ответы (4)


Вы можете выполнить предложение Джона или написать SQL, используя наш InlineQuery, который позволяет вам писать необработанный SQL и передавать параметры:

var qry = new InlineQuery ("ВЫБРАТЬ * ИЗ таблицы WHERE column = @ param", значение)

person Community    schedule 30.03.2009
comment
или var qry = new CodingHorror (SELECT ...); :) - person John Sheehan; 30.03.2009

Вы можете попробовать использовать исходный объект запроса (до 2.1) так (непроверенный, из памяти):

Query q = new Query(VwPropertyList.Schema.TableName);
q.WHERE("29 IN (SELECT Item FROM SPLIT(DistrictGroupList, ','))");

// pass q.ExecuteReader() to the Load() method of your view.
person John Sheehan    schedule 30.03.2009

Я бы посоветовал вам использовать исходный объект Query, поскольку вы хотите получить разбиение на страницы. Встроенный запрос не имеет методов, разрешающих разбиение на страницы.

Если вы абсолютно хотите использовать Subsonic.Select, вы можете объединить две идеи и запустить встроенный запрос, чтобы получить список значений, а затем использовать Regular Subsonic.Select и передать полученные значения в случай выбора, но тогда вы сделаете два поездки в дб.

Кстати, я предпочитаю читать операторы Subsonic.Select, написанные с использованием свободного интерфейса, а именно:

SubSonic.Select.AllColumnsFrom () .Where (VwPropertyList.Columns.IdCreatedBy) .IsEqualTo (123) .And (VwPropertyList.Columns.IdCounty) .IsEqualTo (45) .ExecuteAsCollection ();

person runxc1 Bret Ferrier    schedule 30.03.2009

спасибо за ответы.

Я закончил тем, что сделал InlineQuery и просто переписал код подкачки, который обычно создается Subsonic.Select ... не лучшее решение, но, похоже, оно работает.

Было бы хорошо, если бы я мог сделать что-то вроде этого:

Dim s As New SubSonic. Выберите
s.From (VwPropertyList.Schema)
sWhere (VwPropertyList.Columns.IdCreatedBy) .IsEqualTo (123)
sAnd (VwPropertyList.Columns.IdEqualTos). (45)
s.And (29) .In (New InlineQuery ("(ВЫБРАТЬ элемент ИЗ СПЛИТА (DistrictGroupList, ','))"))

person Community    schedule 31.03.2009