Brauchen Sie Hilfe, um LINQ in MVC zu verstehen?

8

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.

    
Skullomania 23.04.2015, 13:22
quelle

5 Antworten

5

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.

    
Matt Burland 23.04.2015, 13:32
quelle
4

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:

%Vor%

Wenn Sie später die where -Klausel anwenden, mit der Sie konzeptionell enden:

%Vor%

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.

    
Jon Egerton 23.04.2015 13:32
quelle
1

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.

    
Thaoden 23.04.2015 13:32
quelle
1

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 verarbeiten

In 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

    
Dave Bish 23.04.2015 13:32
quelle
0

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 -

%Vor%

Da die Klausel innerhalb von new ein anderes anonymes Objekt ist, das nirgendwo angegeben ist, benötigen Sie das var Schlüsselwort.

    
JunaidKirkire 23.04.2015 13:39
quelle

Tags und Links