2012-02-27 4 views
11

Sto utilizzando LINQ to SQL per gestire l'interrogazione del database per un'applicazione su cui sto lavorando.Controllo automatico di relazioni NULL con query LINQ

Ai fini di questo esempio, immaginate ho alcune tabelle in questo modo

- Company 
- Product 
- Item 
- Order 

e permette di dire una Company ha 0 o più Products, un Product ha 0 o più Items, ed un Item ha 0 o altro Orders.

Ora lascia così ho ottenuto un elenco di Orders, qualcosa come:

IQueryable<Order> myOrders = GetMyOrders(); 

Ora Diciamo che voglio interrogare gli ordini di un particolare Company.Name, ma hanno una situazione in cui ogni tabella ID genitore può essere NULL (so che questo non sembra logico con i miei dati di esempio, ma è solo un esempio)

facendo l'ipotesi che non ci sono gli ID genitore NULL avrei potuto fare questo:

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

Ciò funzionerebbe correttamente, tuttavia, poiché potrebbero esserci valori di ID genitore NULL, è necessario controllare ciascun oggetto padre per assicurarsi che non sia null prima di interrogare il genitore successivo (altrimenti otterrò un'eccezione). Così faccio qualcosa di simile:

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

così la mia domanda è: C'è un modo migliore (in termini di leggibilità e la facilità di codifica) per fare questo di dover includere tutti i controlli nulli? Qualsiasi genitore nullo trovato lungo il percorso dovrebbe comportare l'esclusione dalla lista risultante.

Si prega di non suggerimento per prevenire i genitori nulli, il database non sarà cambia (ed è perfettamente valido in ogni caso) pattren

+0

Meglio come in più performante? Io non la penso così Non riesco a pensare in ogni caso che puoi sbarazzarti di tutti quei controlli "nulli". Meglio per il codice più carino? Vorrei andare con il suggerimento di Lonli-Lokli. – InBetween

+0

@InBetween: Scusa, quando dico meglio intendevo di più per la leggibilità. Ma tenendo presente il mio commento al post di Lonli-Lokli, in cui ho menzionato l'auspicio di farlo funzionare come una query SQL e non di restituire tutti i risultati – musefan

+0

Sembra un'applicazione perfetta per i join interni, che elemineranno tutti gli elementi con riferimenti null . Unisciti a tutte le tabelle e filtra il risultato in base al nome dell'azienda. (Ma questo non sarà più leggibile) – Stephan

risposta

3

è nota (vedi modello oggetto Nullo). Inoltre puoi leggere this article

+1

Ho avuto una lettura di questo articolo ed è stato certamente interessante. Tuttavia, a causa del mio utilizzo, mi chiedo se questo sarebbe appropriato per me. Supponendo che il tuo suggerimento sia quello di creare un metodo di estensione, temo che questo abbia un impatto notevole sulle prestazioni in quanto utilizzo IQueryable e non voglio eseguire la query su tutti i risultati. Naturalmente sto assumendo che dovrei fare questo (ad esempio, lavorare con una lista ) - forse con questa mente sono lasciato a dover fare le cose sulla lunga strada ... qualche pensiero? – musefan

+0

Quindi dovresti scrivere la tua implementazione del provider linq-to-sql e combinare questi metodi di estensione in query sql come suggerito sopra. O puoi semplicemente scrivere quelle query da zero. –