2016-08-09 36 views
0

C# 6.0 in Kürze von Joseph Albahari und Ben Albahari (O'Reilly).Linq Select und SelectMeines Ausführen von Joins

Copyright 2016 Joseph Albahari und Ben Albahari, 978-1-491-92706-9.

Enthüllt in Kapitel 9 die Linq-Operatoren. Für jede Operation, z. B. Filtern, Projizieren, Verbinden usw., werden die in System.Linq verfügbaren Erweiterungsmethoden aufgelistet, um die betreffende Operation auszuführen.

Auf Seite 394, es handelt sich um Projizieren:

Projizieren (Input: IEnumerable<TSource> → Output: IEnumerable<TResult>)

Transformiert jedes Element mit einer Lambda-Funktion. SelectMany flacht verschachtelte Sequenzen ab; SelectundSelectMany zuführen inneren verbindet, links äußere Verknüpfungen, Quer verbindet, und nicht-equi verbindet sich mit LINQ to SQL und EF:

Linq API: Select, Select

Intuitiv ihre viel einfacher zu sehen, wie entspricht dem Beitritt in relationalen Datenbanken, aber was ist mit Select allein? Ich bin mir nicht sicher, ob ich sehe, wie Select alleine irgendeine Verbindung eingehen kann.

Könnte es sein, dass der einzige Fall, in dem Select etwas tut, das entspricht einem Join wie

IEnumerable<TInput> input = ... 

input.Select(new [SomeType] { a = input.a + c, b = input.a + d }; 

ist es dann gesagt werden könnte, dass diese Projection implizit eine Beziehung zwischen Typ TInput und SomeType, und somit ist die Definition darstellt ein Beitritt? Habe ich recht ?

+0

Nein ist nicht wie Beitritt. Wählen Sie viele ist, wenn Sie ein mehrdimensionales Array haben und das select many ein inneres Array verwendet und alle Elemente in die nächsthöhere Dimension des mehrdimensionalen Arrays bewegt. Wenn Sie also eine zweidimensionale Tabelle haben, wird eine Auswahl viele alle Zeilen der Tabelle aufnehmen und zu einem einzigen eindimensionalen Array machen. – jdweng

+0

@jdweng: thanskf für Ihre Eingabe, aber Sie haben gerade erklärt, was technisch eine SelectMany tut. Was ich wusste.Da der Autor Select und SelectMany mit Join verbindet, versuche ich zu erklären, wie sich diese Operatoren auf den Beitritt beziehen. Wie bereits erwähnt, ist SelectMany intuitiver, da die Beziehung zwischen Bestell- und Kauftabellen in eine Klassenbestellung mit einer Liste von Einkäufen übersetzt werden kann. In einer Liste von Aufträgen wird das Ausführen einer SelectMany on Purchases das tun, was Sie beschreiben - wir sind uns alle einig - aber der Punkt der Frage besteht darin, zu analysieren, wo/wie diese Operationen einen Join ausführen (in diesem Beispiel ist es – Veverke

+0

) einfach zu sehen, wie/wo. Select allein ist nicht so intuitiv. – Veverke

Antwort

1

Ein einfaches Beispiel:

context.Students.where(x=> x.StudentID == 1).Select(x=> x.Department).FirstOrDefault(); 

ist equivelant zu:

SELECT TOP 1 D.* FROM Student S 
INNER JOIN Department D 
ON S.DepartmentID = D.DepartmentID 
WHERE S.StudentID = 1 

Grundsätzlich Select in Kombination mit Navigationseigenschaften unter Verwendung von in einem JOIN zu einem bestimmten Zeitpunkt führen. In der obigen Linq-Abfrage wählen Sie die Abteilung für diesen Schüler mit ID == 1.

Ich bin nicht 100% sicher, ob das ein Anbieter INNER oder LEFT beitreten erzeugen würde, aber der Punkt ist, dass eine JOIN-Operation von einem Select Verfahren geführt wird.

+0

Ahm ... so einfach? in der Tat :) – Veverke

+0

Ich denke, es ist oft verwirrend, dass man an Datenbank-Joins denkt, die einen Where-linq-Operator benötigen. – Veverke