2010-10-26 11 views
8

Linq ermöglicht das Ausdrücken innerer Joins mithilfe des Join-Schlüsselworts oder mithilfe von SelectMany() (dh ein paar von Schlüsselwörtern) mit einem Where Stichwort:Wenn Joins mit SelectMany() über Joins mit dem Join-Schlüsselwort in Linq ausgedrückt werden sollen

var personsToState = from person in persons 
        join state in statesOfUS 
        on person.State equals state.USPS 
        select new { person, State = state.Name }; 
foreach (var item in personsToState) 
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

// The same query can be expressed with the query operator SelectMany(), which is 
// expressed as two from clauses and a single where clause connecting the sequences.      
var personsToState2 = from person in persons 
         from state in statesOfUS 
         where person.State == state.USPS 
         select new { person, State = state.Name }; 
foreach (var item in personsToState2) 
{ 
    System.Diagnostics.Debug.WriteLine(item); 
} 

Meine Frage: wann ist es sinnvoll die Join-Stil und wenn zu verwenden, um die in dem Stil zu verwenden, eine Art Leistungsvorteile gegenüber anderen Stil hat?

Antwort

6

Für lokale Anfragen Join ist effizienter, aufgrund seines Schlüssel Nachschlag als Athari mentioned jedoch für LINQ to SQL (L2S) Sie werden aus SelectMany mehr Kilometer bekommen. In L2S verwendet eine schließlich abhängig von Ihrer Abfrage eine Art von SQL-Join im generierten SQL.

Werfen Sie einen Blick auf Fragen 11 & 12 von the LINQ Quiz von Joseph/Ben Albahari, Autoren von C# 4.0 in Kürze. Sie zeigen Proben von verschiedenen Arten von Verknüpfungen und sie erklären:

Mit LINQ to SQL, Select-basierte verbindet die flexibel sind, und können führen beide equi und nicht-equi verbindet. Throw in DefaultIfEmpty, und Sie können linken Outer Joins auch tun!

Zusätzlich Matt Warren hat einen ausführlichen Blog-Eintrag zu diesem Thema, wie es hier IQueryable/SQL betrifft: LINQ: Building an IQueryable provider - Part VII.

Zurück zu Ihrer Frage, welche Sie verwenden sollten, sollten Sie die Abfrage verwenden, die lesbarer ist und Ihnen erlaubt, sich leicht auszudrücken und Ihr Endziel klar zu konstruieren. Leistung sollte keine erste Sorge sein, es sei denn, Sie haben mit großen Sammlungen zu tun und haben beide Ansätze profiliert. In L2S müssen Sie die Flexibilität berücksichtigen, die Ihnen SelectMany bietet, je nachdem, wie Sie Ihre Daten koppeln müssen.

2

Join ist effizienter, es verwendet Lookup-Klasse (eine Variante des Dictionary mit mehreren Werten für einen einzelnen Schlüssel), um übereinstimmende Werte zu finden.

+0

Beide Methoden sind * effektiv *, aber Join ist wahrscheinlich mehr * effizient * ... –

+0

@Thomas Levesque Vielen Dank für Ihre Korrektur, Englisch ist nicht meine Muttersprache. – Athari