Общая стратегия для сложных многоэтапных поисков

У меня есть приложение, позволяющее выполнять поиск определенного объекта на основе нескольких различных критериев (где-то всего порядка 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...)

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

Мне было бы очень интересно услышать предложения о том, как другие справились с этой ситуацией. Я' m, безусловно, открыт для любых возможностей, которые я не исследовал выше.

Для справки, это приложение .NET, использующее NHibernate ORM, поддерживаемое базой данных SQL Server 2008 R2.

Я уже решил использовать для этого либо hql, либо собственный sql, поскольку ICriteria или Linq не обеспечивают гибкости, необходимой для выполнения отдельных запросов или требуемых операций объединения.

5
задан DanP 17 November 2010 в 02:45
поделиться