Ich bin ziemlich neu bei MVC von webforms und es war eine sehr, sehr steile Lernkurve für mich. Hier ist die Funktion in der Anleitung, der ich folge:
%Vor%Hier ist, was ich denke, dass ich weiß, dass das passiert. Die Methode ist ein Aktionsergebnis (ohne Parameter), das eine Ansicht zurückgibt. Die Parameter werden hinzugefügt, um der Anwendung mitzuteilen, dass sie nach einer "ID" -String suchen soll.
Ich finde die Lambda-Aussage etwas leichter zu verstehen. Die if
überprüft, ob searchString
null ist, wenn sie nicht den Film zurückgibt, der der Beschreibung in searchString
entspricht.
In der Methode wird searchString
jedoch der Wert von id
im Parameter zugewiesen. Hier beginne ich zu verlieren, gleich nachdem searchString
definiert wurde, wird eine LINQ-Anweisung in die Variable movies
eingefügt. In dieser Aussage, was ist der Zweck von m
? Warum ist es nicht definiert oder ist es? Dasselbe mit dem s
im Lambda.
Sowohl m
als auch s
werden implizit typisiert. Da Sie m
von movies
auswählen, müssen Sie LINQ nicht mitteilen, was m
ist. Es kann den Typ implizieren, indem man sich ansieht, was db.Movies
eine Sammlung von ist. Wenn db.Movies
also IEnumerable<Movie>
ist (zum Beispiel), dann wäre m
ein Movie
.
Es gibt nichts, was Sie daran hindern könnte, den Typ anzugeben, wenn Sie das wirklich wollen, also könnten Sie Folgendes eingeben:
%Vor%Aber Sie müssen selten.
Beachten Sie, dass Sie auch movies
implizit eingeben, es ist dasselbe Konzept. Solange der Compiler eindeutig herausfinden kann, was der Typ sein soll.
Die Variablen m
und s
sind Variablen für jede Instanz von Movie
innerhalb der db.Movies
"Sammlung" (ich nehme an, dass die Klasse so heißt).
Im Prinzip ähnelt dies der Verwendung von SQL Alias m
im folgenden sql:
Wenn Sie später die where
-Klausel anwenden, mit der Sie konzeptionell enden:
Beachten Sie, dass dies nicht der Fall ist, wenn der sql tatsächlich gegen die Datenbank läuft, sondern nur eine Darstellung, um das Verständnis zu erleichtern.
Wenn Sie sich den Wert von movies
ansehen, sehen Sie, dass es sich um IQueryable
oder ähnliches handelt. Das bedeutet, dass es noch nicht ausgeführt wurde - Sie haben nichts zurückgegeben. Das Hinzufügen der where
-Klausel ist also in Ordnung - sie wird nur zur Abfrage hinzugefügt, die später ausgeführt wird.
var movies = from m in db.Movies select m
übersetzt sich grob zu "Nimm alle Objekte in db.Movies und benenne sie temporär m, dann gib sie in einem IEnumerable zurück". In der Tat sehen Sie, dass movies
vom Typ IEnumerable<Movie>
ist.
Gleiches gilt für movies = movies.Where(s => s.Title.Contains(searchString));
: Benennen Sie alle Elemente in Filmen temporär s
und geben Sie diejenigen zurück, deren Title
Ihre searchString
als IEnumerable
enthält.
Ich hoffe, es wurde ein bisschen klarer.
Ok - ich werde versuchen zu erklären, was passiert:
mit:
%Vor%Sie beschreiben eine Möglichkeit, die Sammlung 'db.Movies' (was auch immer das ist ...)
zu verarbeitenIn beschreibender Sprache:
1) in dbo.Movies
Wir werden alles in db.Movies überprüfen / durchlaufen.
2) from m
Wenn wir 1-mal-1 über sie gehen, speichern wir jedes Ding, auf das wir stoßen, in einer Variablen namens 'm' für die weitere Verwendung im Ausdruck.
3) select m
OK - wir möchten, dass diese Abfrage / der Ausdruck tatsächlich etwas zurückgibt - um tatsächlich einige Ergebnisse zu liefern - also lasst 1-by-1 einfach das 'm' zurückgeben, das wir früher deklariert haben
Die Variablen m
und s
verwenden die Schlüsselwörter var
, was bedeutet, dass Sie den Typ der Variablen nicht explizit angeben müssen. Der Compiler ermittelt es für Sie. Es ist im Grunde eine Variable vom Typ IEnumerable
.
Das Schlüsselwort var
ist im Allgemeinen nützlich, wenn Sie den Rückgabetyp von movies
nicht wie unten gezeigt explizit definieren können -
Da die Klausel innerhalb von new
ein anderes anonymes Objekt ist, das nirgendwo angegeben ist, benötigen Sie das var
Schlüsselwort.
Tags und Links asp.net-mvc c# linq