Вызов функции SQL из Subsonic.Select
Я задал следующий вопрос на дозвуковом форуме, но, похоже, получил только один ответ, так что я решил опубликовать здесь также, чтобы посмотреть, сможет ли кто-нибудь еще пролить свет на эту проблему...
Я хочу создать следующий оператор SQL через SubSonic, используя инструмент Select (или инструмент Query).. он использует пользовательскую функцию под названием "SPLIT ()":
SELECT * FROM VwPropertyList
ГДЕ VwPropertyList.idCreatedBy = 123
AND VwPropertyList.idCounty = 45
И 29 В (ВЫБРАТЬ элемент ИЗ РАЗДЕЛЕНИЯ (DistrictGroupList, ','))
(последняя часть этого SQL использует функцию SPLIT)
Мой дозвуковой эквивалент выглядит следующим образом...
Dim mySelect As New 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 & ", ',')"))
Это не работает, хотя из-за последней части.. как я могу добавить "И 29 IN (ВЫБРАТЬ элемент из SPLIT (DistrictGroupList, ','))" в мой Subsonic.Select?
Ответ, который я получил от дозвукового форума, предложил мне покончить с Subsonic.Select и заменить жестко закодированными утверждениями InlineQuery().. как:
Dim SQL as String = "Select" & VwPropertyList.Columns.Item
SQL = SQL & "From" & VwPropertyList.Schema.TableName
SQL = SQL & "Где" & 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, если это возможно, хотя бы так, чтобы я мог воспользоваться функциональностью подкачки и т. Д.
Есть идеи?
4 ответа
Вы можете сделать предложение Джона или написать SQL, используя наш InlineQuery, который позволяет писать сырой SQL и передавать параметры:
var qry = new InlineQuery ("SELECT * FROM таблицы WHERE column=@param", значение)
Вы можете попытаться использовать исходный объект запроса (до версии 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.
Спасибо за ответы.
Я закончил с 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).In (Новый InlineQuery("(ВЫБРАТЬ элемент ИЗ РАЗДЕЛЕНИЯ (DistrictGroupList, ','))"))
Я бы посоветовал вам использовать исходный объект Query, так как вы хотите получить подкачку. Inline Query не имеет методов, позволяющих выполнять пейджинг.
Если вы абсолютно хотели использовать Subsonic.Select, вы могли бы объединить две идеи и запустить Inline Query, чтобы получить список значений, а затем использовать Regular Subsonic.Select и передать полученные значения в случай выбора, но тогда вы бы сделали два поездки в БД.
Что касается примечания, я предпочитаю читать операторы Subsonic.Select, написанные с использованием свободного интерфейса, а именно
SubSonic.Select.AllColumnsFrom() .Where(VwPropertyList.Columns.IdCreatedBy).IsEqualTo(123) .And(VwPropertyList.Columns.IdCounty).IsEqualTo(45) .ExecuteAsCollection();