2010-03-13 7 views
10

Gestern I posted this question in Bezug auf die Verwendung von Lambda innerhalb einer Join() - Methode, um zu überprüfen, ob 2 Bedingungen über 2 Entitäten existieren. Ich habe eine Antwort auf die Frage erhalten, die perfekt funktioniert hat. Ich dachte nach dem Lesen des MSDN-Artikels über die Enumerable.Join() -Methode, ich würde genau verstehen, was passiert ist, aber ich nicht. Könnte jemand mir helfen, zu verstehen, was im folgenden Code vor sich geht (speziell die Methode Join())? Danke im Voraus.Hilfe Verstehen Enumerable.Join Methode

if (db.TableA.Where(a => a.UserID == currentUser) 
     .Join(db.TableB.Where(b => b.MyField == someValue), 
      o => o.someFieldID, 
      i => i.someFieldID, 
      (o,i) => o) 
     .Any()) 
{ 
    //... 
} 

Edit: Insbesondere, ich bin gespannt auf die letzten drei Parameter, und dem, was tatsächlich vor sich geht. Wie führen sie in den Signaturanforderungen von Func (touter, TKey), Func (TInner, TKey) usw.

Antwort

3

Eric und Nick haben beide gute Antworten gegeben.

Sie können den Linq-Abfrageausdruck auch mithilfe der Abfragesyntax schreiben (vs.Methode Syntax, die Sie in Ihrem Beispiel verwenden):

var query = from a in db.TableA 
      join b in db.TableB on a.someFieldID equals b.someFieldID 
      where a.UserID == currentUser && b.MyField == someValue 
      select a; 

     if (query.Any()) { 
      ... 
     } 

Update:

Sie scheinen auf der Lambda-Ausdrücke stecken. Es ist eine Funktion, die Sie wie eine Variable weitergeben. Ein Lambda-Ausdruck entspricht einem anonymen Delegaten (oder einer anonymen Methode, für mich allgemeiner).

Hier ist Ihre Abfrage mit der Lambda-Ausdrücke als Delegierten (ersetzen EntityType mit der Art Ihres Unternehmens aus TableA zurückgegeben, natürlich):

if (db.TableA.Where(delegate(EntityType a) { return a.UserID == currentUser; }) 
    .Join(db.TableB.Where(delegate(EntityType b) { return b.MyField == someValue; }), 
     delegate(EntityType o) { return o.somefieldId); }, 
     delegate(EntityType i) { return i.someFieldId); }, 
     delegate(EntityType o, EntityType i) { return o; }) 
    .Any()) 

{ // ... }

HINWEIS: Ein Lambda-Ausdruck hat wichtige Aspekte, die ihn zu mehr als nur einem Äquivalent für anonyme Methoden machen. Ich empfehle Ihnen, andere SO-Fragen zu lesen und online insbesondere über Lambda-Ausdrücke zu lesen. Sie ermöglichen es, sehr mächtige Ideen viel einfacher und eleganter auszudrücken. Es ist ein tiefes Thema, aber die Grundlagen sind leicht genug zu verstehen. Es ist eine Funktion, die Sie wie eine Variable oder als Parameter an andere Funktionen weitergeben können.

+0

Ja, ich hatte es vorher schon so geschrieben, und nachdem ich realisiert hatte, dass es mit der Join-Methode mit Lambda funktioniert, dachte ich, ich würde mich selbst herausfordern. Ich glaube immer noch, dass dieser Weg klarer ist, und werde wahrscheinlich die Lösung auf diese Weise implementieren, aber ich möchte zuerst die andere Technik vollständig verstehen. –

+1

Sollte in Ihrem aktualisierten Beispiel der zweite Delegat (EntityType o) kein Delegate (EntityType i) sein? –

+0

Ja, danke Metro Schlumpf (Ich kann nicht glauben, dass diese beiden Wörter nacheinander vorkommen, lol). –

2

Diese Abfrage sagen TableA-TableB wird kommen, wo TableA.someFieldID == TableB.someFieldID und von TableA die Ergebnisse der Auswahl und zu sehen, ob es irgendwelche bei allen Ergebnissen

In Bezug auf die SQL denken Sie daran, wie diese, auch wenn es nicht Linq-to-SQL ist ..., wenn Sie mit SQL vertraut sind vielleicht dies mehr Sinn macht:

Select Count(*) 
From TableA a 
    Join TableB b 
     On a.someFieldID = b.someFieldID 

Dann Überprüfung wenn Count(*)> 0 ist

15

Die Join-Syntax

FirstTable.Join(SecondTable, FirstTableKeyExtractor, SecondTableKeyExtractor, Selector) 

So ist man zwei Tabellen haben. Sie haben einen Schlüssel, der beiden Tabellen gemeinsam ist. Sie stellen zwei Schlüsselextraktoren bereit, die wissen, wie der Schlüssel aus jeder Zeile in der Tabelle abgerufen wird.

Die Join-Logik identifiziert Paare von Zeilen, eine aus jeder Tabelle, die denselben Schlüssel haben.

Jede dieser Zeilen wird dann durch den Selektor geleitet, um das Ergebnis zu projizieren.

Beantwortet das Ihre Frage?

+0

Fast. Ich verstehe, dass der erste Parameter eine Entität ist (einer Tabelle, die diesen Bedingungen entspricht), aber ich bin gespannt, wie die anderen 3 Parameter funktionieren. Was genau passiert an dieser Stelle: o => o.SomeFieldID, i => i.SomeFieldID, (o, i) => o –

+0

@lush - Der zweite Parameter sagt, welches Feld auf der ursprünglichen Tabelle Sie ' Der dritte Parameter gibt an ('TableA.someFieldID'), welches Feld in der Joined-Tabelle, mit der Sie es verbinden, übereinstimmt (' TableB.someFieldID'). Der letzte Parameter sagt aus diesem neu verbundenen Satz von Tabellen, was Sie auswählen ... in diesem Fall ist das alles von 'TableA'. In deinem Code könntest du "o" durch "a" und "i" durch "b" ersetzen, was es viel klarer erscheinen lässt. –

+0

Aber wie übersetzt sich der Code "o => o.SomeFieldID" zu "TableA.SomeFieldID"? Was passiert unter der Motorhaube? –

4

Erläuterung der Verbindung.

b = Objekttyp der ersten Tabelle o = Objekttyp der ersten Tabelle i = Objekttyp der zweiten Tabelle

  1. db.TableB.Where(b => b.MyField == someValue) Dies ist der Elementtyp der zweiten Tabelle
  2. o => o.someFieldID Der Schlüssel die erste Tabelle
  3. i => i.someFieldID Der Schlüssel der zweiten Tabelle (der den Schlüssel in der ersten Tabelle entspricht)
  4. (o,i) => o Das zurückzugebende Objekt, in diesem Fall der Objekttyp der ersten Tabelle.
Verwandte Themen