Я в настоящее время запрос Многокритериального, который фильтрует результаты на основе идентификаторов, находящихся в пределах подзапросаNHibernate многокритериального КТР подзапрос
Subqueries.PropertyIn("Id", detachedCriteria)
Суба запрос является одинаковым для всех запросов, используемых в запросе многокритериального ,
Кажется, немного уродливым взглядом на sql, что дополнительный запрос повторяется, в моем текущем случае 15 раз.
Причина отдельных запросов заключается в том, что у каждого есть разные объединения и не требуется одно массивное декартово соединение.
Если бы я писал SQL вручную, я бы вытаскивать повторный запрос к югу в общее табличное выражение
WITH XYZ AS
{
....
}
, а затем к югу от запроса будет где идентификатор в XYZ в 15 запросов.
Это немного конкретный сервер sql, альтернативой будет временная таблица или другая конкретная функция базы данных.
Любые идеи о том, как улучшить запрос, или я придерживаюсь дублирования дублирующих запросов?
Спасибо за информацию, прочитав ваши советы, нашел эту статью, подтверждающую, что вы говорите. http://www.singingeels.com/Articles/Understanding_SQL_Complex_Queries.aspx «Следует отметить, что CTE можно использовать только один раз в вашем запросе. Таким образом, вы не можете объявить свой CTE сверху, затем выполните несколько запросов против но вы можете сделать несколько CTE, а затем использовать их вместе в одном запросе. Кроме того, все имеет свое место, поэтому, если вы обнаружите, что несколько раз создаете один и тот же CTE для разных отчетов/запросов, вы можете захотеть что вместо этого. – Ian
В моем случае я не могу создать хранимую процедуру, как и динамический запрос. И создание представления для каждого динамического запроса будет медленнее, есть журнал транзакций (может помещаться в другую связанную базу данных с простым режимом восстановления). Хорошо знать, что CTE не помогло бы мне в моем сценарии. – Ian
@Ian: Вы можете * использовать хранимую процедуру. Просто передайте все входные параметры, используемые в вашем запросе NHibernate. Если у вас много параметров или списков вещей (например, идентификаторы), вы можете рассмотреть возможность передачи параметров в виде XML. –