Mam aplikację, która pozwala na przeszukanie określonej jednostki w oparciu o kilka różnych kryteriów (w sumie w sumie 20 różnych metod). Chcę móc łączyć wyniki kilku wyszukiwań w celu utworzenia pojedynczego zestawu wyników.Ogólna strategia dla złożonych, wieloetapowych wyszukiwań
Na przykład:
results = (entities from search 1 AND entities from search 2) OR (entities from search 3)
Załóżmy, że wyszukiwanie jest dość złożony charakter taki, że łącząc je w jednym zapytaniu logicznej nie jest możliwe (ze względu na skomplikowane relacje, które muszą być sprawdzony, itp).
Załóżmy również, że liczba zaangażowanych podmiotów (prawdopodobnie) sprawia, że strategia in-memory jest niewykonalna.
Moje pierwsze myśli były czymś wzdłuż linii:
1) Wykonaj wyszukiwanie osobno, otrzymać listę pasujących „identyfikatory jednostki” od każdego z nich, a następnie wykonać „root-level” szukaj w oparciu na tych.
Na przykład
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) Wykonaj zewnętrzną zapytanie, które wybiera się w oparciu o jednostkę wyników zwróconych moi (kompleks) podzapytaniach.
Na przykład:
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...)
Oczywiście, te przykłady są znacznie uproszczone dla celów ilustracyjnych; poszczególne zapytania będą bardziej zaangażowane, a ich połączenie będzie arbitralne (właśnie zilustrowałem tutaj reprezentatywny przykład).
Byłbym bardzo zainteresowany słuchaniem sugestii, jak inni radzą sobie z tą sytuacją. Jestem otwarty na wszelkie możliwości, których nie odkryłem powyżej.
Dla porównania jest to aplikacja .NET wykorzystująca ORM NHibernate wspieraną przez bazę danych SQL Server 2008 R2.
Zdecydowałem się już na użycie sql lub natywnego sql, ponieważ ICriteria lub Linq nie zapewniają elastyczności potrzebnej do wykonywania poszczególnych zapytań ani wymaganych operacji łączenia.
Dziękuję za dzwonienie, jest to bardzo pouczające z punktu widzenia wydajności (co oczywiście jest głównym powodem). – DanP