2016-05-27 7 views
1

Mit den folgenden linq und Lambda-Ausdrücke, was ist der beste Ansatz für die Verbindung von zwei Datensätze mit mehreren Join-Bedingungen? Alle Abfragen erzeugen identische Ergebnisse.Der beste Ansatz für den Beitritt zu zwei Datensätzen

var q1 = (from t1 in table1 
    from y in table2 
    where t1.ColumnName == y.ColumnName 
    && t1.ColumnName2 == y.ColumnName2 
    select t1).ToList(); 

var q2 = (from t1 in table1 
    join y in table2 on new { Key1 = t1.ColumnName, Key2 = t1.ColumnName2 } 
    equals new { Key1 = y.ColumnName, Key2 = y.ColumnName2 } 
    select t1).ToList(); 

var q3 = table1.Join(table2, 
    t1 => new { Key1 = t1.ColumnName, Key2 = t1.ColumnName2 }, 
    y => new { Key1 = y.ColumnName, Key2 = y.ColumnName2 }, 
    (t1, y) => new { t1 }).ToList(); 

Zum Spaß habe ich meine Abfragen in drei Unit-Tests getrennt. Ich fügte eine Stoppuhr hinzu, um die Ausführung jedes Tests zeitlich zu bestimmen. Mit dem Code in Release jeden Test ergab folgende Ergebnisse

Q1: Abgelaufene: 2500 Zecken

Q2: Abgelaufene: 11381 Zecken

Q3: Abgelaufene: 2406 Zecken

Diese Ergebnisse sind überraschend zu mich. Kann jemand erklären?

Antwort

1

q2 und q3 sind identisch, es ist nur eine andere Syntax vom Compiler erlaubt. q2 heißt query syntaxq3 heißt Method Syntax. Der Compiler wandelt q2 automatisch in q3 um.

q1 ist Kreuz verbinden, q2 und q3 sind INNER Joins. Sie sollten q2 für bessere Lesbarkeit verwenden.

By the way, können Sie ersetzen q3 mit:

var q3 = table1.Join(table2, 
     t1 => new { Key1 = t1.ColumnName, Key2 = t1.ColumnName2 }, 
     y => new { Key1 = y.ColumnName, Key2 = y.ColumnName2 }, 
     (t1, y) => new { t1 }).ToList(); 
+0

Ist die Quer führen verbinden schlimmer dann die innere Verknüpfung. Ist der einzige Unterschied in der Lesbarkeit? –

+0

@DarthPaper Viel schlimmer. Kartesisches Produkt, weißt du? –

Verwandte Themen