2010-07-08 4 views
1

Я в настоящее время запрос Многокритериального, который фильтрует результаты на основе идентификаторов, находящихся в пределах подзапросаNHibernate многокритериального КТР подзапрос

Subqueries.PropertyIn("Id", detachedCriteria)

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

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

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

Если бы я писал SQL вручную, я бы вытаскивать повторный запрос к югу в общее табличное выражение

WITH XYZ AS 
{ 
    .... 
} 

, а затем к югу от запроса будет где идентификатор в XYZ в 15 запросов.

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

Любые идеи о том, как улучшить запрос, или я придерживаюсь дублирования дублирующих запросов?

ответ

1

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

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

+0

Спасибо за информацию, прочитав ваши советы, нашел эту статью, подтверждающую, что вы говорите. http://www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx «Следует отметить, что CTE можно использовать только один раз в вашем запросе. Таким образом, вы не можете объявить свой CTE сверху, затем выполните несколько запросов против но вы можете сделать несколько CTE, а затем использовать их вместе в одном запросе. Кроме того, все имеет свое место, поэтому, если вы обнаружите, что несколько раз создаете один и тот же CTE для разных отчетов/запросов, вы можете захотеть что вместо этого. – Ian

+0

В моем случае я не могу создать хранимую процедуру, как и динамический запрос. И создание представления для каждого динамического запроса будет медленнее, есть журнал транзакций (может помещаться в другую связанную базу данных с простым режимом восстановления). Хорошо знать, что CTE не помогло бы мне в моем сценарии. – Ian

+0

@Ian: Вы можете * использовать хранимую процедуру. Просто передайте все входные параметры, используемые в вашем запросе NHibernate. Если у вас много параметров или списков вещей (например, идентификаторы), вы можете рассмотреть возможность передачи параметров в виде XML. –

Смежные вопросы