Tengo una aplicación que permite buscar una determinada entidad en función de varios criterios diferentes (en algún lugar del orden de 20 métodos diferentes en total). Quiero poder combinar los resultados de varias búsquedas para producir un solo conjunto de resultados.Estrategia general para búsquedas complejas en varias etapas
Por ejemplo:
results = (entities from search 1 AND entities from search 2) OR (entities from search 3)
Vamos a suponer que las búsquedas son lo suficientemente complejas en la naturaleza, que combina en una sola consulta lógica no es posible (debido a las relaciones complejas que necesitan ser consultada, etc.)
Supongamos también que el número de entidades involucradas (probable) hace que cualquier tipo de estrategia en memoria sea inviable.
Mis pensamientos iniciales eran algo a lo largo de las líneas de:
1) Llevar a cabo las búsquedas por separado, obtener una lista de resultados con "ID de entidad" de cada uno de ellos, y luego realizar un "nivel de raíz" búsqueda basados sobre estos.
Por ejemplo:
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) realizar una consulta externa que selecciona la entidad en base a los resultados devueltos por mis subconsultas (complejo).
Por ejemplo:
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...)
Obviamente estos ejemplos se han simplificado de manera drástica para fines de ilustración; las consultas individuales serán mucho más complicadas, y la combinación de ellas será arbitraria (acabo de ilustrar un ejemplo representativo aquí).
Estaría muy interesado en escuchar sugerencias sobre cómo otros han manejado esta situación. Estoy ciertamente abierto a cualquier posibilidad que no haya explorado anteriormente.
Como referencia, esta es una aplicación .NET que hace uso de un ORM NHibernate respaldado por una base de datos SQL Server 2008 R2.
Ya he decidido usar hql o sql nativo para esto ya que ICriteria o Linq no proporcionan la flexibilidad necesaria para realizar las consultas individuales ni las operaciones de combinación requeridas.
Gracias por sonar, esto es muy informativo desde un aspecto de rendimiento (que es una consideración importante, obviamente). – DanP