У меня есть приложение, которое позволяет искать определенную сущность на основе нескольких различных критериев (где-то порядка 20 различных методов). Я хочу, чтобы была возможность объединить результаты нескольких поисков, чтобы создать один набор результатов.
Например:
results = (entities from search 1 AND entities from search 2) OR (entities from search 3)
Предположим, что поиски достаточно сложны по своей природе, так что объединить их в один логический запрос невозможно (из-за сложных взаимосвязей, которые необходимо запрашивать и т. Д.).
Предположим также, что количество задействованных сущностей (вероятно) делает какую-либо стратегию в памяти недопустимой.
Мои первоначальные мысли были чем-то вроде:
1) Выполнить поиск отдельно, получить список подходящих «идентификаторов сущностей» для каждого из них, а затем выполнить поиск «корневого уровня» на основании этих данных.
Например:
select * from entity e
where
(e.Id in (search 1 id list) AND e.Id in(search 2 id list))
OR e.Id in (search 3 id list)
2) Выполнить внешний запрос, который выбирает сущность на основе результатов, возвращаемых моими (сложными) подзапросами.
Например:
select * from entity e
where (e.Id in (select e1.id from entity e1 where ...) AND e.Id in (select e2.id from entity e2 where...))
OR e.Id in (select e3.id from entity e3 where...)
Очевидно, что эти примеры радикально упрощены в целях иллюстрации; отдельные запросы будут гораздо более сложными, и их комбинация будет произвольной (я только что проиллюстрировал здесь репрезентативный пример).
Мне было бы очень интересно услышать предложения о том, как другие справились с этой ситуацией. Я, безусловно, открыт для любых возможностей, которые я не исследовал выше.
Для справки: это приложение .NET, использующее NHibernate ORM, поддерживаемое базой данных SQL Server 2008 R2.
Я уже решил использовать для этого либо hql, либо собственный sql, поскольку ICriteria или Linq не обеспечивают гибкость, необходимую для выполнения отдельных запросов, а также необходимые операции объединения.