"Field1 = 'bla-bla' AND (Field2 IS NOT NULL OR Field3 like '%bla-bla%') and Field4<>4"
Есть объект класса, который представляет собой запись в таблице БД. Как разобрать строку фильтра и выполнить ее программно для каждого объекта?
Я так понимаю, что нужен некий парсер. В результате его работы получается нечто на выходе и далее это нечто надо выполнить. Важна скорость. Дык вот как?
ЗЫ: кое-что похожее поиском нашел, но конкретной реализации не было Может у кого есть, чтоб не возиться...
Здравствуйте, hugo, Вы писали:
H>Есть некая строка фильтра (SQL). Например,
H>
H>"Field1 = 'bla-bla' AND (Field2 IS NOT NULL OR Field3 like '%bla-bla%') and Field4<>4"
H>
H>Есть объект класса, который представляет собой запись в таблице БД. Как разобрать строку фильтра и выполнить ее программно для каждого объекта? H>Я так понимаю, что нужен некий парсер. В результате его работы получается нечто на выходе и далее это нечто надо выполнить. Важна скорость. Дык вот как?
H>ЗЫ: кое-что похожее поиском нашел, но конкретной реализации не было Может у кого есть, чтоб не возиться...
В строке фильтра у вас имена колонок или полей/проперти обьекта?
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
-----------------------------------------
тут может быть ваша реклама
N>В строке фильтра у вас имена колонок или полей/проперти обьекта?
Имена полей. Причем, передаваемый объект-строка суть object[], поэтому придется с помощью маппинга переводить строковое имя поля в индекс.
Вобщем-то путь решения я наметил, делаю. Но может уже что-то готовое есть?
Проблема в том, что родной DataView уж очень медленно работает (да и без DataTable тоже быстрей немного) — сортировка 380 000 записей выполняется за 23 сек. Хочу попробовать ускорить этот процесс. Сортировать получилось быстрее в 2 раза. Щас пытаюсь победить фильтрацию...
Здравствуйте, Козьма Прутков, Вы писали:
КП>А что если подглядеть у NHibernate? У них есть некий HQL, как раз что-то такое тебе и надо.
Мне собственно говоря надо тока строку фильра разпарсить, типа WHERE в SQL заросе. Разпарсеную строку надо выполнить программно, каким-то кодом на C#. Т.е., преобразовать условие в реальные операторы, переменные и объекты и наложить это условие на каждую строку выборки (object[]) HQL мне подойдет? Я просто с ним никогда не общался...
Ясно, тогда пара вариантов
1. глянуть рефлектором как сделан и реализован девекпресовский IXtraFilter интерфейс. 2. Если делать фильтр в своей коллекции, то делай внутренний массив, который держит всеелементы а на выход давай фильтрованные если задан параметр фильтра. Ессесно что парсер надо сделать самому (но советую глянуть у девекспреса в примерах там такой парсер реализован)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
-----------------------------------------
тут может быть ваша реклама
> Мне собственно говоря надо тока строку фильра разпарсить, типа WHERE в SQL заросе. Разпарсеную строку надо выполнить программно, каким-то кодом на C#. Т.е., преобразовать условие в реальные операторы, переменные и объекты и наложить это условие на каждую строку выборки (object[]) HQL мне подойдет? Я просто с ним никогда не общался...
Я тоже, тока по документации сужу HQL правда пошире (там еще from есть, агрегаты и т.д.), но наверняка кучу всего оттуда можно стырить, ибо реализация имеет открытый код. Вот тут язык описан — пробегись глазами, может найдешь сходство со своей задачей: http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html
Здравствуйте, hugo, Вы писали:
H>Есть некая строка фильтра (SQL). Например,
H>"Field1 = 'bla-bla' AND (Field2 IS NOT NULL OR Field3 like '%bla-bla%') and Field4<>4"
H>Есть объект класса, который представляет собой запись в таблице БД. Как разобрать строку фильтра и выполнить ее программно для каждого объекта? H>Я так понимаю, что нужен некий парсер. В результате его работы получается нечто на выходе и далее это нечто надо выполнить. Важна скорость. Дык вот как?
H>ЗЫ: кое-что похожее поиском нашел, но конкретной реализации не было Может у кого есть, чтоб не возиться...
Попробуй посмотреть как реализован метод System.Data.DataTable.Select()
или создай DataTable, с полями, соответствующими полям объекта и выполни Select над таблицей
Здравствуйте, nauro, Вы писали:
N>1. глянуть рефлектором как сделан и реализован девекпресовский IXtraFilter интерфейс. 2. Если делать фильтр в своей коллекции, то делай внутренний массив, который держит всеелементы а на выход давай фильтрованные если задан параметр фильтра. Ессесно что парсер надо сделать самому (но советую глянуть у девекспреса в примерах там такой парсер реализован)
А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть
Здравствуйте, hugo, Вы писали:
H>Здравствуйте, nauro, Вы писали:
H>А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть
поищи в туториалах проэкт под названием GridIXtraRowFilter
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
-----------------------------------------
тут может быть ваша реклама
Здравствуйте, nauro, Вы писали:
N>Здравствуйте, hugo, Вы писали:
H>>Здравствуйте, nauro, Вы писали:
H>>А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть N>поищи в туториалах проэкт под названием GridIXtraRowFilter
Я нашел в исходниках код парсера. Тока он у них разбирает всего два условия по AND или OR, простенький совсем. Да и потом авторсике права Зато теперь я знаю, что сложности мне не нужны: я ж свой парсер как раз под XtraGrid пишу
Здравствуйте, hugo, Вы писали:
H>>>А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть N>>поищи в туториалах проэкт под названием GridIXtraRowFilter H>Я нашел в исходниках код парсера. Тока он у них разбирает всего два условия по AND или OR, простенький совсем. Да и потом авторсике права Зато теперь я знаю, что сложности мне не нужны: я ж свой парсер как раз под XtraGrid пишу
А какая задача, если не секрет?
В любом случае лучше посмотреть в сторону третьего грида. Там в дате есть готовый парсер (CriteriaOperator.Parse) и даже Evaluator для получившегося критерия.