nhibernate многокритериальный подзапрос CTE - PullRequest
1 голос
/ 08 июля 2010

В настоящее время у меня есть запрос MultiCriteria, который фильтрует результаты на основе идентификаторов, находящихся в подзапросе

Subqueries.PropertyIn("Id", detachedCriteria)

Подзапрос одинаков для всех запросов, используемых в многокритериальном запросе.

Кажется немного уродливым смотреть на sql, что подзапрос повторяется, в моем текущем случае 15 раз.

Причина отдельных запросов заключается в том, что каждый из них имеет разные объединения и не хочет одно массивное декартово соединение.

Если бы я писал sql вручную, я бы вытащил повторный подзапрос в общее табличное выражение

WITH XYZ AS
{
    ....
}

и тогда подзапрос будет где id в XYZ в 15 запросах.

Это немного зависит от сервера sql, альтернативой может быть временная таблица или другая особенность базы данных.

Есть идеи, как улучшить запрос, или я застрял с дублирующимися подзапросами?

1 Ответ

1 голос
/ 15 ноября 2010

Что ж, если вы возвращаете несколько наборов результатов, использование WITH не поможет вам в любом случае, поскольку оно может применяться только к одному выражению SELECT.

В любом случае, чтобы сделать код уровня данных независимым от базы данных, я бы, вероятно, вставил фактическую логику запроса в хранимую процедуру. Это означает, что вы можете отправиться в город, используя специфические для движка функции, потому что все это скрыто за общедоступным интерфейсом. Да, вам нужно будет переопределить запрос для каждого механизма базы данных, который вы поддерживаете (которого обычно очень мало), но вы получите полный контроль над тем, что запускается на каждом ядре, и ваш код доступа к данным будет чертовски чище .

...