2012-02-27 13 views
11

Używam LINQ do SQL do obsługi zapytań do bazy danych dla aplikacji, nad którą pracuję.Automatyczne sprawdzanie relacji NULL z zapytaniami LINQ

Dla celów tego przykładu, wyobraźmy sobie mam kilka tabel jak tak

- Company 
- Product 
- Item 
- Order 

i pozwala powiedzieć Company ma 0 lub więcej Products, A Product ma 0 lub więcej Items, i Item ma wartość 0 lub więcej Orders.

Teraz pozwala więc uzyskaliśmy listę Orders, coś jak:

IQueryable<Order> myOrders = GetMyOrders(); 

Teraz powiedzmy, że chcę zapytać rozkazy dla konkretnego Company.Name, ale do czynienia z sytuacją, gdzie każda tabela rodzic ID może być NULL (wiem, to nie wydaje się logiczne z moich przykładowych danych, ale jest to tylko przykład)

przy założeniu, że nie ma NULL identyfikatory rodzic mógłby zrobić to:

var filteredOrders = myOrders.Where(x => x.Item.Product.Company.Name == "Company1"); 

Mogłoby to jednak działać dobrze, ponieważ mogą istnieć wartości identyfikatorów nadrzędnych NULL, należy sprawdzić każdy obiekt nadrzędny, aby upewnić się, że nie jest on null przed wysłaniem zapytania do następnego elementu nadrzędnego (w przeciwnym razie otrzymam wyjątek). Więc zrób coś takiego:

var filteredOrders = myOrders.Where(x => 
    x.Item != null && 
    x.Item.Product != null && 
    x.Item.Product.Company != null && 
    x.Item.Product.Company.Name == "Company1"); 

więc moje pytanie: Czy istnieje lepszy sposób (pod względem czytelności i łatwości Coding), aby to zrobić niż konieczności obejmować wszystkie kontrole zerowe? Dowolni rodzice o zerowym napotkaniu po drodze powinni spowodować wykluczenie z wynikowej listy.

proszę żadne sugestie dotyczące zapobiegania zerowe rodziców, baza danych nie będzie zmianę (i jest całkowicie poprawny w każdym razie)

+0

Lepsze, jak w bardziej wydajnych? Nie sądzę. Nie mogę nawet myśleć, że możesz pozbyć się tych wszystkich "zerowych" czeków. Lepsze co do ładniejszego kodu? Pójdę z sugestią Lonli-Lokli. – InBetween

+0

@InBetween: Przepraszam, kiedy mówię lepiej, miałem na myśli więcej dla czytelności. Ale pamiętaj o moim komentarzu do posta Lonli-Lokli, gdzie wspomniałem o tym, że ostatecznie powinien on być uruchamiany jako zapytanie SQL i nie zwracać najpierw wszystkich wyników. – musefan

+0

Brzmi jak idealna aplikacja do wewnętrznego łączenia, która eliminuje wszystkie elementy z zerowymi odniesieniami . Dołącz do wszystkich tabel i filtruj wyniki według nazwy firmy. (Ale to nie będzie bardziej czytelne) – Stephan

Odpowiedz

3

Znany pattren (patrz pusty obiekt). Możesz również przeczytać: this article

+1

Przeczytałem ten artykuł i było to z pewnością interesujące. Jednak z powodu mojego użycia zastanawiam się, czy byłoby to odpowiednie dla mnie. Zakładając, że twoja sugestia ma na celu stworzenie metody rozszerzenia, obawiam się, że będzie to dla mnie dużym osiągnięciem wydajności, ponieważ używam IQueryable i nie chcę wykonywać kwerendy dla wszystkich wyników. Oczywiście zakładam, że musiałbym to zrobić (np. Pracować z Listą ) - może tym właśnie jest umysł, który muszę robić rzeczy na dłuższą metę ... jakiekolwiek myśli? – musefan

+0

Następnie należy napisać własną implementację dostawcy linq-sql i połączyć te metody rozszerzeń z zapytaniami sql, jak sugerowano powyżej. Lub możesz po prostu napisać te zapytania od podstaw. –

Powiązane problemy