2013-06-25 19 views
12

Mi piacerebbe sapere quali sono le differenze tra queste due istruzioni linq?Linq To Objects - Under The Hood Of Joins

Cosa è più veloce?

Sono uguali?

Qual è la differenza tra questa affermazione

from c in categories 
from p in products 
where c.cid == p.pid 
select new { c.cname, p.pname }; 

e questa affermazione?

from c in categories 
join p in products on c.cid equals p.pid 
select new { c.cname, p.pname }; 

Grazie in anticipo ragazzi.

EDIT: Nel contesto di LINQ to Objects

+2

Nel contesto di LINQ to Objects, LINQ to SQL/EF o qualcos'altro? –

+0

LINQ to Objects –

+0

Suppongo tu voglia dire 'p.pid' nella seconda query, a proposito. –

risposta

14

Va bene, all'interno di LINQ to Objects la differenza può essere molto drammatico.

La prima forma esamina ognic e p coppia, i controlli per c.cid essendo uguale a p.pid e le rese partite.

Il secondo modulo (all'interno di Join) crea innanzitutto una ricerca basata su hash da pid per la corrispondenza degli elementi Product. Quindi esegue lo streaming di categories, quindi controlla ogni categoria in cui sono presenti gli elementi Product corrispondenti nella ricerca in base allo c.cid. Questo è in genere molto più efficiente in quanto ha solo bisogno di guardare attraverso products una volta e creare la ricerca basata su hash. D'altra parte, ha un maggiore ingombro di memoria. Tutto questo è fatto in modo un po 'pigramente - è solo quando chiedi il primo risultato che succede qualcosa di significativo.

Per ulteriori dettagli sull'operazione Join, vedere il numero Edulinq blog post on the topic.

+0

Va bene, ho capito. Grazie Jon Skeet. –