2010-06-16 15 views
6

Jak mogę zmusić NHibernate zrobić prawo sprzężenia zewnętrznego lub sprzężenie wewnętrzne zamiast LEFT OUTER JOIN na wiele do wielu kolekcji?wewnętrzna lub zewnętrzna prawa Zarejestrowany w NHibernate i Fluent NHibernate na wiele do wielu kolekcji

Powodem chciałbym zrobić to dlatego filtrowania stosowane do elementów kolekcji. Po połączeniu lewym uzyskuje się taką samą liczbę wierszy zwróconych jako zapytanie niefiltrowane, ale elementy, które są odfiltrowane, pokazują tylko NULL dla wszystkich pól. Jednak przy prawym sprzężeniu zwracana jest poprawna liczba wierszy i elementów z zapytania.

Spodziewam się, że można określić gdzieś przyłączenia w mapowaniu kolekcji ..

+0

Czy to ma sens? prosi o pobranie kolekcji jednostek, które naprawdę nie mają połączenia z główną jednostką. – Jaguar

+0

@ Jaguar: Tak, ponieważ mam przypadek, w którym filtry są stosowane do połączonych elementów. Ponieważ jednak tabela łączenia jest podstawową tabelą w zapytaniu, po złączeniu LEWY uzyskuje się więcej wierszy niż rzeczywistych filtrowanych encji, które chcę, przy czym jednostki, które są odfiltrowane, mają po prostu wartość NULL we wszystkich kolumnach. – snicker

Odpowiedz

5

Nie sądzę, że to możliwe, aby określić prawo lub sprzężenia wewnętrznego w mapowaniu kolekcji. Jedynymi opcjami z klauzulą ​​fetch są domyślne lewe sprzężenie zewnętrzne i wybór sekwencyjny.

Problemem jest to, że podczas tworzenia odwzorowania, NHibernate musi wiedzieć, jak pobrać elementy zbiórki dowolnej pozycji głównego z lewej strony łączenia. Po połączeniu prawym lub wewnętrznym obiekt główny może nie istnieć w zwróconej kolekcji, więc utkniesz w tym momencie.

Jeżeli kryteria filtru jest statyczne, można określić where klauzuli w mapowaniu. Myślę, że byłoby to zalecane rozwiązanie dla twojej sytuacji.

Obejście problemu polegałoby na uczynieniu kolekcji prywatną w obiekcie, a następnie utworzeniu innej właściwości, która wywoła kwerendę HQL w celu implementacji sprzężenia wewnętrznego i zwróci tę kolekcję. Ta zwrócona kolekcja ma semantykę, jakiej potrzebujesz, ale będziesz potrzebować oddzielnych metod dodawania lub usuwania elementów z kolekcji.

+0

To jest w zasadzie rozwiązanie, które zaimplementowałem. Pozwoliłem, aby zapytania zwróciły całą kolekcję niefiltrowaną i ręcznie wykonano filtrowanie po stronie aplikacji. Niezbyt elegancka ze względu na ilość dodatkowych danych napływających przez przewód w niektórych przypadkach, ale zdecydowanie jest to najłatwiejsze rozwiązanie bez pękania otwartego źródła NH i szerokie wchłanianie go w to, co chcę. – snicker

+0

To jest powód, dla którego zaproponowałem wywołanie HQL z nieruchomości. Filtrowanie odbyłoby się w DB. Nie musisz robić nic specjalnego w NH, wystarczy uruchomić zapytanie z niezazwo lonej właściwości. W zależności od zestawu danych, zmniejszony transfer danych może być znaczny. –

1

Można użyć składni HQL NHibernate do wygenerowania zapytania, które jest przypominający SQL, lecz wykorzystuje możliwości mapowania NHibernate jest. HQL obsługuje right outer join (lub po prostu right join w skrócie). Następujące strony są dobre referencje dla języka zapytań HQL NHibernate za:

+0

Potrzebuję, aby tak się stało przy każdym pobieraniu z bazy danych. Nie tylko konkretne zapytania. – snicker

Powiązane problemy