2010-09-15 9 views
11

Qual è la differenza traQual è la differenza tra dove e unisciti?

var q_nojoin = from o in one 
       from t in two 
       where o.SomeProperty == t.SomeProperty 
       select new { o, t }; 

e

var q_join = from o in one 
      join t in two on o.SomeProperty equals t.SomeProperty 
      select new { o, t }; 

Essi sembrano darmi gli stessi risultati.

+1

È uguale a SQL implicito vs join esplicito. Entrambi sono join, ma il secondo è esplicito. – spender

+0

È "Qualunque cosa ti si addice" - Ha visto cosa ho fatto lì – PostMan

risposta

14

Forniscono lo stesso risultato, ma il join è molto più veloce, a meno che non si utilizzi LINQ to SQL in modo che il database possa ottimizzare le query.

Ho eseguito un test con due array contenenti 5000 elementi ciascuno e la query con un join era circa 450 volte più veloce (!) Della query senza join.

Se si utilizza LINQ su SQL, il database ottimizzerà entrambe le query per eseguire lo stesso lavoro, quindi in questo caso non ci sono differenze di prestazioni. Tuttavia, un join esplicito è considerato più leggibile.

Se si utilizza LINQ su un'altra origine dati, non esiste un livello di ottimizzazione, quindi c'è una differenza significativa nel modo in cui le query funzionano. Il join utilizza una tabella hash o simile per cercare rapidamente i valori corrispondenti, mentre la query senza un join confronta tutti gli elementi in una tabella con ciascun elemento nell'altra tabella. La complessità del join è approssimativamente O (n + m), mentre la complessità della query senza il join è O (n * m). Ciò significa non solo che la query senza il join è più lenta, ma anche che si adatta in modo errato, così come i dati crescono diventerà esponenzialmente più lento.

1

Un JOIN è un mezzo per combinare i campi da due (o più) tabelle utilizzando valori comuni a ciascuno.

Una clausola WHERE specifica che un'istruzione SQL (linguaggio di manipolazione dei dati) deve interessare solo le righe che soddisfano determinati criteri (si pensi a una clausola WHERE come FILTRO).

+0

Non risponde affatto alla mia domanda :( –

+0

ah, la semantica di una query LINQ è diversa (wr WHERE e JOIN) da quella di una query ANSI SQL? –

+0

Sicuramente anche in una query SQL questo non risponde alla domanda: tu dici "UN JOIN è un mezzo per combinare i campi da due tabelle" ma sicuramente lo è anche da a, b dove a.Field = b.Field', quindi non risponde alla domanda qual è la differenza – Timwi

0

in pratica, a seconda di molti altri fattori, è possibile ottenere miglioramenti delle prestazioni utilizzando uno rispetto all'altro. Immagino (anche se non ho alcuna base di fatto per questo) che i join siano più sargable delle clausole WHERE.

modifica: risulta che ho sbagliato completamente. Lì (dovrebbe esserci) nessuna differenza per le prestazioni tra i due tipi. Tuttavia, lo stile più recente (usando JOIN) è molto più chiaro da leggere (imo) e inoltre, Microsoft ha affermato che non supporterà lo stile più vecchio (outer-join che usa WHERE) indefinitamente.

0

In realtà in SQL, le dichiarazioni join-on possono essere scritte nelle istruzioni from-where (se proprio si desidera). Ma sai che abbiamo left joinleft outer join ed ecc. In istruzioni SQL, che ci rendono più facile esprimere ciò che vogliamo (ovviamente puoi anche usare from-where ma renderà il tuo codice un pazzo). Quindi usiamo sempre where se vogliamo filtrare il nostro risultato, mentre usi join se c'è una relazione tra le tabelle.

0

La prima query sta dicendo, in effetti, "Fate un cross join nelle collezioni (creazione essensially una matrice NxM), quindi prendere solo quelli che sono lungo la diagonale, e dare loro a me"

Il la seconda query è, in effetti, "Crea una lista di solo gli articoli combinati in cui le entrate corrispondono".

I risultati sono gli stessi, ma il processo per arrivarci è un po 'diverso.

Poiché i database SQL sono generalmente altamente ottimizzati, quindi quando chiedi il primo, il server dice semplicemente "Idiot user ...." e sostituisce il secondo.

In ambienti non SQL (come Linq-to-Objects), se chiedi il primo, questo è quello che farà e vedrai un notevole calo di prestazioni.

Problemi correlati