Ho un'applicazione che consente di cercare una determinata entità in base a diversi criteri (da qualche parte nell'ordine di 20 metodi diversi in totale). Voglio essere in grado di combinare i risultati di diverse ricerche al fine di produrre un singolo set di risultati.Strategia generale per ricerche complesse a più stadi
Ad esempio:
results = (entities from search 1 AND entities from search 2) OR (entities from search 3)
Supponiamo che le ricerche sono abbastanza complessi di natura tale che la loro combinazione in una singola query logica non è possibile (a causa di relazioni complesse che necessitano di essere interrogato, eccetera).
Supponiamo inoltre che il numero di entità coinvolte (probabile) renda impossibile qualsiasi tipo di strategia in memoria.
miei pensieri iniziali erano qualcosa sulla falsariga di:
1) Effettuare le ricerche separatamente, ottenere un elenco di corrispondenza "id entità" da ciascuno di essi, e quindi eseguire un "livello root" di ricerca in base su questi.
Ad esempio:
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) Eseguire una query esterna che seleziona l'entità sulla base dei risultati restituiti dai miei subquery (completo).
Ad esempio:
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...)
Ovviamente questi esempi sono drasticamente semplificate a scopo illustrativo; le singole query saranno molto più coinvolte e la loro combinazione sarà arbitraria (ho appena illustrato un esempio rappresentativo qui).
Sarei molto interessato a ricevere suggerimenti su come gli altri hanno gestito questa situazione. Sono certamente aperto a qualsiasi possibilità che non ho esplorato sopra.
Per riferimento, questa è un'applicazione .NET che utilizza un ORM NHibernate supportato da un database SQL Server 2008 R2.
Ho già deciso di utilizzare hql o sql nativo per questo come ICriteria o Linq non forniscono la flessibilità necessaria per l'esecuzione delle singole query né le operazioni di combinazione richieste.
Grazie per intervenire, questo è molto istruttivo da un aspetto di prestazione (che è una considerazione importante ovviamente). – DanP