Программно выполнить строку фильтра
От: hugo Австрия  
Дата: 02.09.05 07:09
Оценка:
Есть некая строка фильтра (SQL). Например,

"Field1 = 'bla-bla' AND (Field2 IS NOT NULL OR Field3 like '%bla-bla%') and Field4<>4"


Есть объект класса, который представляет собой запись в таблице БД. Как разобрать строку фильтра и выполнить ее программно для каждого объекта?
Я так понимаю, что нужен некий парсер. В результате его работы получается нечто на выходе и далее это нечто надо выполнить. Важна скорость. Дык вот как?

ЗЫ: кое-что похожее поиском нашел, но конкретной реализации не было Может у кого есть, чтоб не возиться...
Re: Программно выполнить строку фильтра
От: nauro Украина  
Дата: 02.09.05 07:34
Оценка:
Здравствуйте, 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>>
-----------------------------------------
тут может быть ваша реклама
Re: Программно выполнить строку фильтра
От: Козьма Прутков Россия  
Дата: 02.09.05 07:41
Оценка:
А что если подглядеть у NHibernate? У них есть некий HQL, как раз что-то такое тебе и надо.
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
Re[2]: Программно выполнить строку фильтра
От: hugo Австрия  
Дата: 02.09.05 07:43
Оценка:
Здравствуйте, nauro, Вы писали:


N>В строке фильтра у вас имена колонок или полей/проперти обьекта?


Имена полей. Причем, передаваемый объект-строка суть object[], поэтому придется с помощью маппинга переводить строковое имя поля в индекс.

Вобщем-то путь решения я наметил, делаю. Но может уже что-то готовое есть?

Проблема в том, что родной DataView уж очень медленно работает (да и без DataTable тоже быстрей немного) — сортировка 380 000 записей выполняется за 23 сек. Хочу попробовать ускорить этот процесс. Сортировать получилось быстрее в 2 раза. Щас пытаюсь победить фильтрацию...
Re[2]: Программно выполнить строку фильтра
От: hugo Австрия  
Дата: 02.09.05 07:47
Оценка:
Здравствуйте, Козьма Прутков, Вы писали:

КП>А что если подглядеть у NHibernate? У них есть некий HQL, как раз что-то такое тебе и надо.


Мне собственно говоря надо тока строку фильра разпарсить, типа WHERE в SQL заросе. Разпарсеную строку надо выполнить программно, каким-то кодом на C#. Т.е., преобразовать условие в реальные операторы, переменные и объекты и наложить это условие на каждую строку выборки (object[]) HQL мне подойдет? Я просто с ним никогда не общался...
Re[3]: Программно выполнить строку фильтра
От: nauro Украина  
Дата: 02.09.05 07:48
Оценка:
Здравствуйте, hugo, Вы писали:

Ясно, тогда пара вариантов
1. глянуть рефлектором как сделан и реализован девекпресовский IXtraFilter интерфейс. 2. Если делать фильтр в своей коллекции, то делай внутренний массив, который держит всеелементы а на выход давай фильтрованные если задан параметр фильтра. Ессесно что парсер надо сделать самому (но советую глянуть у девекспреса в примерах там такой парсер реализован)
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
-----------------------------------------
тут может быть ваша реклама
Re[3]: Программно выполнить строку фильтра
От: Козьма Прутков Россия  
Дата: 02.09.05 08:06
Оценка:
> Мне собственно говоря надо тока строку фильра разпарсить, типа WHERE в SQL заросе. Разпарсеную строку надо выполнить программно, каким-то кодом на C#. Т.е., преобразовать условие в реальные операторы, переменные и объекты и наложить это условие на каждую строку выборки (object[]) HQL мне подойдет? Я просто с ним никогда не общался...
Я тоже, тока по документации сужу HQL правда пошире (там еще from есть, агрегаты и т.д.), но наверняка кучу всего оттуда можно стырить, ибо реализация имеет открытый код. Вот тут язык описан — пробегись глазами, может найдешь сходство со своей задачей: http://www.hibernate.org/hib_docs/reference/en/html/queryhql.html
Posted via RSDN NNTP Server 1.9
Да хранит вас господь в сухом прохладном месте...
Re: Программно выполнить строку фильтра
От: _FRED_ Черногория
Дата: 02.09.05 08:08
Оценка:
Здравствуйте, 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 над таблицей
<< RSDN@Home 1.2.0 alpha rev. 601 >> =12:07= [Windows 2003 — 5.2.3790.65536]
under «*none*»
Help will always be given at Hogwarts to those who ask for it.
Re[4]: Программно выполнить строку фильтра
От: hugo Австрия  
Дата: 02.09.05 08:18
Оценка:
Здравствуйте, nauro, Вы писали:

N>1. глянуть рефлектором как сделан и реализован девекпресовский IXtraFilter интерфейс. 2. Если делать фильтр в своей коллекции, то делай внутренний массив, который держит всеелементы а на выход давай фильтрованные если задан параметр фильтра. Ессесно что парсер надо сделать самому (но советую глянуть у девекспреса в примерах там такой парсер реализован)


А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть
Re[5]: Программно выполнить строку фильтра
От: nauro Украина  
Дата: 02.09.05 08:22
Оценка: 2 (1)
Здравствуйте, hugo, Вы писали:

H>Здравствуйте, nauro, Вы писали:


H>А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть

поищи в туториалах проэкт под названием GridIXtraRowFilter
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
-----------------------------------------
тут может быть ваша реклама
Re[6]: Программно выполнить строку фильтра
От: hugo Австрия  
Дата: 02.09.05 09:02
Оценка:
Здравствуйте, nauro, Вы писали:

N>Здравствуйте, hugo, Вы писали:


H>>Здравствуйте, nauro, Вы писали:


H>>А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть

N>поищи в туториалах проэкт под названием GridIXtraRowFilter

Я нашел в исходниках код парсера. Тока он у них разбирает всего два условия по AND или OR, простенький совсем. Да и потом авторсике права Зато теперь я знаю, что сложности мне не нужны: я ж свой парсер как раз под XtraGrid пишу
Re[7]: Программно выполнить строку фильтра
От: SAY  
Дата: 02.09.05 11:31
Оценка:
Здравствуйте, hugo, Вы писали:

H>>>А в каких примерах? У меня девекспы есть, с исходниками, сам думал туда заглянуть

N>>поищи в туториалах проэкт под названием GridIXtraRowFilter
H>Я нашел в исходниках код парсера. Тока он у них разбирает всего два условия по AND или OR, простенький совсем. Да и потом авторсике права Зато теперь я знаю, что сложности мне не нужны: я ж свой парсер как раз под XtraGrid пишу

А какая задача, если не секрет?
В любом случае лучше посмотреть в сторону третьего грида. Там в дате есть готовый парсер (CriteriaOperator.Parse) и даже Evaluator для получившегося критерия.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.