Есть ли возможность добавить фильтрацию в sql-запросе с передачей аргументов?

В ресстре используеться источником данных sql-запрос, который собирает данные по сложному алгоритму, из-за большего количества join-ов и данных запрос отрабатывает долго. Установка where в необходимых местах с прокинутыми значениями параметров ускорило бы работу запроса.
Нет ли опыта решения такой проблемы у кого нибудь на проекте? Или же это уже прикладное решение, в виде самописного реестра и сервиса к нему ?

1 Лайк

Можно попробовать сделать хендлер для этого реестра, и в его фильтре наложить нужное условие.

Условие из фильтра хандлера применяется на весь итоговый SQL - запрос, из-за чего запрос отрабатывает очень долго.

Но + к этому, есть ли возможность прокинуть параметры вот так в любое место запроса:

SELECT * FROM users u, logs l
WHERE u.usrid=$1 AND u.usrid=l.usrid AND l.date = $2;

Приведу пример. В проекте УНП, к примеру, есть представление

CREATE OR REPLACE VIEW public.additional_information_fp
AS SELECT pav.id,
    pav.projectv AS projectversion_id,
    pav.numpp AS code_information,
    pr.name AS section_information,
    format_text_regexp_html(pav.infostring) AS add_information
   FROM projectinfo_actual_versions pav
     JOIN projectdir pr ON pr.id = pav.projectdirs;

если при запросе данных этого представления использовать фильтр по колонке представления code_information, то этот фильтр будет применен на исходном запросе
image

так что в случае, если представление не материализовано, параметры будут использованы на исходной выборке

Таким образом, если используется нематериализованный еще IQueryable, то выражение типа
Q.Where(x => x.CodeInformation == "2") будет транслировано в корректный sql, и параметр фильтра будет использован при фильтрации запроса.

Напомню, на всякий случай, что для sql-запросов описанных в Конструкторе генерируется ридонли сущность, с которой можно работать так же как и со всеми остальными через IDataStore.GetAll<>