Entity Framework - Projektionsabfragen
LINQ zu Entitäten
Eines der wichtigsten Konzepte zum Verständnis von LINQ to Entities ist, dass es sich um eine deklarative Sprache handelt. Der Fokus liegt darauf, zu definieren, welche Informationen Sie benötigen, und nicht darauf, wie Sie die Informationen erhalten.
Dies bedeutet, dass Sie mehr Zeit mit der Arbeit mit Daten verbringen können und weniger Zeit damit verbringen müssen, den zugrunde liegenden Code herauszufinden, der für Aufgaben wie den Zugriff auf die Datenbank erforderlich ist.
Es ist wichtig zu verstehen, dass deklarative Sprachen dem Entwickler keine Kontrolle entziehen, aber es hilft dem Entwickler, die Aufmerksamkeit auf das Wesentliche zu lenken.
LINQ to Entities Wesentliche Schlüsselwörter
Es ist wichtig, die grundlegenden Schlüsselwörter zu kennen, die zum Erstellen einer LINQ-Abfrage verwendet werden. Es gibt nur wenige Schlüsselwörter, an die Sie sich erinnern müssen. Sie können sie jedoch auf verschiedene Arten kombinieren, um bestimmte Ergebnisse zu erzielen. Die folgende Liste enthält diese grundlegenden Schlüsselwörter und enthält eine einfache Beschreibung der einzelnen Schlüsselwörter.
Sr. Nr. | Schlüsselwort & Beschreibung |
---|---|
1 | Ascending Gibt an, dass eine Sortieroperation vom kleinsten (oder niedrigsten) Element eines Bereichs zum höchsten Element eines Bereichs stattfindet. Dies ist normalerweise die Standardeinstellung. Wenn Sie beispielsweise eine alphabetische Sortierung durchführen, liegt die Sortierung im Bereich von A bis Z. |
2 | By Gibt das Feld oder den Ausdruck an, mit dem eine Gruppierung implementiert wird. Das Feld oder der Ausdruck definiert einen Schlüssel, der zum Ausführen der Gruppierungsaufgabe verwendet wird. |
3 | Descending Gibt an, dass eine Sortieroperation vom größten (oder höchsten) Element eines Bereichs zum niedrigsten Element eines Bereichs stattfindet. Wenn Sie beispielsweise eine alphabetische Sortierung durchführen, liegt die Sortierung im Bereich von Z bis A. |
4 | Equals Wird zwischen der linken und der rechten Klausel einer Join-Anweisung verwendet, um die primäre Kontextdatenquelle mit der sekundären Kontextdatenquelle zu verbinden. Das Feld oder der Ausdruck links neben dem Schlüsselwort equals gibt die primäre Datenquelle an, während das Feld oder der Ausdruck rechts neben dem Schlüsselwort equals die sekundäre Datenquelle angibt. |
5 | From Gibt die Datenquelle an, die zum Abrufen der erforderlichen Informationen verwendet wird, und definiert eine Bereichsvariable. Diese Variable hat den gleichen Zweck wie eine Variable, die für die Iteration in einer Schleife verwendet wird. |
6 | Group Organisiert die Ausgabe anhand des von Ihnen angegebenen Schlüsselwerts in Gruppen. Verwenden Sie mehrere Gruppenklauseln, um mehrere Ebenen der Ausgabeorganisation zu erstellen. Die Reihenfolge der Gruppenklauseln bestimmt die Tiefe, in der ein bestimmter Schlüsselwert in der Gruppierungsreihenfolge angezeigt wird. Sie kombinieren dieses Schlüsselwort mit by, um einen bestimmten Kontext zu erstellen. |
7 | In Wird auf verschiedene Arten verwendet. In diesem Fall bestimmt das Schlüsselwort die für eine Abfrage verwendete kontextbezogene Datenbankquelle. Bei der Arbeit mit einem Join wird das Schlüsselwort in für jede kontextbezogene Datenbankquelle verwendet, die für den Join verwendet wird. |
8 | Into Gibt einen Bezeichner an, den Sie als Referenz für LINQ-Abfrageklauseln wie Join, Group und Select verwenden können. |
9 | Join Erstellt eine einzelne Datenquelle aus zwei verwandten Datenquellen, z. B. in einem Master- / Detail-Setup. Ein Join kann einen inneren, einen Gruppen- oder einen linken äußeren Join angeben, wobei der innere Join die Standardeinstellung ist. Weitere Informationen zu Joins finden Sie unter msdn.microsoft.com |
10 | Let Definiert eine Bereichsvariable, mit der Sie Unterausdrucksergebnisse in einem Abfrageausdruck speichern können. In der Regel wird die Bereichsvariable verwendet, um eine zusätzliche Aufzählung bereitzustellen oder die Effizienz einer Abfrage zu erhöhen (sodass eine bestimmte Aufgabe, z. B. das Ermitteln des Kleinbuchstabenwerts einer Zeichenfolge, nicht mehr als einmal ausgeführt werden muss). |
11 | On Gibt das Feld oder den Ausdruck an, mit dem ein Join implementiert wird. Das Feld oder der Ausdruck definiert ein Element, das beiden kontextbezogenen Datenquellen gemeinsam ist. |
12 | Orderby Erstellt eine Sortierreihenfolge für die Abfrage. Sie können das Schlüsselwort aufsteigend oder absteigend hinzufügen, um die Reihenfolge der Sortierung zu steuern. Verwenden Sie mehrere orderby-Klauseln, um mehrere Sortierebenen zu erstellen. Die Reihenfolge der orderby-Klauseln bestimmt die Reihenfolge, in der die Sortierausdrücke behandelt werden. Die Verwendung einer anderen Reihenfolge führt also zu einer anderen Ausgabe. |
13 | Where Definiert, was LINQ aus der Datenquelle abrufen soll. Sie verwenden einen oder mehrere Boolesche Ausdrücke, um die Besonderheiten des Abrufs zu definieren. Die Booleschen Ausdrücke werden durch && (AND) und || voneinander getrennt (ODER) Operatoren. |
14 | Select Bestimmt die Ausgabe der LINQ-Abfrage, indem angegeben wird, welche Informationen zurückgegeben werden sollen. Diese Anweisung definiert den Datentyp der Elemente, die LINQ während des Iterationsprozesses zurückgibt. |
Projektion
Projektionsabfragen verbessern die Effizienz Ihrer Anwendung, indem nur bestimmte Felder aus Ihrer Datenbank abgerufen werden.
Sobald Sie die Daten haben, möchten Sie sie möglicherweise nach Bedarf projizieren oder filtern, um die Daten vor der Ausgabe zu formen.
Die Hauptaufgabe eines LINQ to Entities-Ausdrucks besteht darin, Daten abzurufen und als Ausgabe bereitzustellen.
Der Abschnitt „Entwickeln von LINQ to Entities-Abfragen“ in diesem Kapitel zeigt die Techniken zur Ausführung dieser grundlegenden Aufgabe.
Werfen wir einen Blick auf den folgenden Code, in dem die Liste der Schüler abgerufen wird.
using (var context = new UniContextEntities()) {
var studentList = from s in context.Students select s;
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
}
Einzelobjekt
Um ein einzelnes Schülerobjekt abzurufen, können Sie die Aufzählungsmethoden First () oder FirstOrDefault verwenden, die das erste Element einer Sequenz zurückgeben. Der Unterschied zwischen First und FirstOrDefault besteht darin, dass First () eine Ausnahme auslöst, wenn für die angegebenen Kriterien keine Ergebnisdaten vorhanden sind, während FirstOrDefault () den Standardwert null zurückgibt, wenn keine Ergebnisdaten vorhanden sind. Im folgenden Codefragment wird der erste Schüler aus der Liste abgerufen, dessen Vorname Ali ist.
using (var context = new UniContextEntities()) {
var student = (from s in context.Students where s.FirstMidName
== "Ali" select s).FirstOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Sie können auch Single () oder SingleOrDefault verwenden, um ein einzelnes Schülerobjekt abzurufen, das ein einzelnes, spezifisches Element einer Sequenz zurückgibt. Im folgenden Beispiel wird ein einzelner Schüler mit der ID 2 abgerufen.
using (var context = new UniContextEntities()) {
var student = (from s in context.Students where s.ID
== 2 select s).SingleOrDefault<Student>();
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
Console.ReadKey();
}
Liste der Objekte
Wenn Sie die Liste der Schüler abrufen möchten, deren Vorname Ali ist, können Sie die Aufzählungsmethode ToList () verwenden.
using (var context = new UniContextEntities()) {
var studentList = (from s in context.Students where s.FirstMidName
== "Ali" select s).ToList();
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
Auftrag
Um Daten / Listen in einer bestimmten Reihenfolge abzurufen, können Sie das Schlüsselwort orderby verwenden. Im folgenden Code wird die Snippet-Liste des Schülers in aufsteigender Reihenfolge abgerufen.
using (var context = new UniContextEntities()) {
var studentList = (from s in context.Students orderby
s.FirstMidName ascending select s).ToList();
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
Standard Vs Projection Entity Framework-Abfrage
Angenommen, Sie haben ein Studentenmodell, das die ID, den Vornamen, den Nachnamen und das Registrierungsdatum enthält. Wenn Sie eine Liste der Schüler zurückgeben möchten, gibt eine Standardabfrage alle Felder zurück. Wenn Sie jedoch nur eine Liste der Schüler abrufen möchten, die die Felder ID, Vorname und Nachname enthalten. Hier sollten Sie eine Projektionsabfrage verwenden. Es folgt das einfache Beispiel einer Projektionsabfrage.
using (var context = new UniContextEntities()) {
var studentList = from s in context.Students
orderby s.FirstMidName ascending
where s.FirstMidName == "Ali"
select new {s.ID, s.FirstMidName, s.LastName};
foreach (var student in studentList) {
string name = student.FirstMidName + " " + student.LastName;
Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}
Console.ReadKey();
}
Die obige Projektionsabfrage schließt das Feld EnrollmentDate aus. Dadurch wird Ihre Bewerbung viel schneller.