Вызов функции SQL из Subsonic.Select - PullRequest
0 голосов
/ 30 марта 2009

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

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

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

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

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

Dim mySelect As New SubSonic. Выберите
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 & ", ',')"))

Это не работает, хотя из-за последней части ... как я могу добавить " И 29 IN (ВЫБРАТЬ элемент из SPLIT (DistrictGroupList, ',')) " в мой Subsonic.Select?

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

Dim SQL as String = "Выбрать" & VwPropertyList.Columns.Item
SQL = SQL & " От " & VwPropertyList.Schema.TableName
SQL = SQL & "Где" & VwPropertyList.Columns.IdCreatedBy & " = @CreatedBy "
SQL = SQL &" And "& VwPropertyList.Columns.IdCounty &" = @County "
SQL = SQL &" And @DistrictGroup IN (Выбрать элемент из SPLIT (DistrictGroupList, ',') "

предметов = SubSonic.InlineQuery (). ExecuteTypedList (Из MyItem) (SQL, 123,45,29)

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

Есть идеи?

Ответы [ 4 ]

2 голосов
/ 30 марта 2009

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

var qry = new InlineQuery ("SELECT * FROM таблицы WHERE column = @ param", значение)

1 голос
/ 30 марта 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.
0 голосов
/ 31 марта 2009

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

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

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

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

0 голосов
/ 31 марта 2009

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

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

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

SubSonic.Select.AllColumnsFrom () .Где (VwPropertyList.Columns.IdCreatedBy) .IsEqualTo (123) Й (VwPropertyList.Columns.IdCounty) .IsEqualTo (45) .ExecuteAsCollection ();

...