linq -OUTER OUTER VERBINDUNG
Wie können Sie eine vollständige Konzeption zwischen den beiden Objekten basierend auf dem Feld der öffentlichen Schlüssel durchführen, um sicherzustellen, dass alle Aufzeichnungen der beiden Listen in den Ergebnissen enthalten sind.
Antwort:
1. benutzerdefinierte Erweiterungsmethode, die mit dem gesamten Außenbereich verbunden ist
Um eine äußere Verbindung in LINQ zu erreichen, können wir eine benutzerdefinierte Erweiterungsmethode definieren, wie unten gezeigt:2. implementieren
In dem angegebenen Beispiel haben wir zwei Listen:<code class="language-csharp">public static IEnumerable<TResult> FullOuterJoin<TA, TB, TKey, TResult>( this IEnumerable<TA> a, IEnumerable<TB> b, Func<TA, TKey> selectKeyA, Func<TB, TKey> selectKeyB, Func<TA, TB, TKey, TResult> projection, TA defaultA = default(TA), TB defaultB = default(TB), IEqualityComparer<TKey> cmp = null) { cmp = cmp ?? EqualityComparer<TKey>.Default; var alookup = a.ToLookup(selectKeyA, cmp); var blookup = b.ToLookup(selectKeyB, cmp); var keys = new HashSet<TKey>(alookup.Select(p => p.Key), cmp); keys.UnionWith(blookup.Select(p => p.Key)); var join = from key in keys from xa in alookup[key].DefaultIfEmpty(defaultA) from xb in blookup[key].DefaultIfEmpty(defaultB) select projection(xa, xb, key); return join; }</code>
firstNames
3. Erläuterung
lastNames
Dieser Code verwendet eine linke Außenverbindung, und jeder Datensatz in
<code class="language-csharp">var outerJoin = from first in firstNames join last in lastNames on first.ID equals last.ID into temp from last in temp.DefaultIfEmpty() select new { id = first != null ? first.ID : last.ID, firstname = first != null ? first.Name : string.Empty, surname = last != null ? last.Name : string.Empty };</code>
anwenden können, um sicherzustellen, dass sie nicht satisierende Datensätze enthält. Dies erkennt tatsächlich die linke externe Verbindung, nicht eine vollständige Verknüpfung im gesamten Sinne. Um eine äußere Verbindung zu erreichen, müssen Sie die oben angepasste firstNames
-Expansionsmethode verwenden. lastNames
into temp
4. Erwarten Sie Ausgabe lastNames
DefaultIfEmpty()
Die erwartete Ausgabe der äußeren Verbindung ist: FullOuterJoin
Mit der Erweiterungsmethode können Sie den Standardwert für unbefriedigende Datensätze angeben. Im Beispiel geben wir
für den unbefriedigenden Namen an und geben die negative Ganzzahl für die nicht vergleichende ID an.<code>ID FirstName LastName -- --------- -------- 1 John Doe 2 Sue 3 Smith</code>
Die Laufzeit der gesamten externen Verbindung ist O (n m), wobei n und m die Länge der beiden Eingangslisten sind. Dies liegt daran, dass der Betrieb von string.Empty
o (n) Zeit und nachfolgende Operationen o (n m) Zeit erfordern.
Diese Implementierung der gesamten äußeren Verbindung ist derzeit nicht Teil des LINQ -Standards, wird jedoch empfohlen, sie in die zukünftige Version einzubeziehen. Standard LINQ unterstützt die äußere Verbindung nicht direkt und muss angepasst werden, um sie zu erreichen. ToLookup()
Das obige ist der detaillierte Inhalt vonWie führe ich einen vollständigen Outer -Join in Linq aus?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!