Freigeben über


Abfragen und Suchen von Entitäten

In diesem Thema werden die verschiedenen Möglichkeiten behandelt, wie Sie Daten mithilfe von Entity Framework abfragen können, einschließlich LINQ und der Find-Methode. Die in diesem Thema gezeigten Techniken gelten gleichermaßen für Modelle, die mit Code First und EF Designer erstellt wurden.

Suchen von Entitäten mithilfe einer Abfrage

DbSet und IDbSet implementieren IQueryable und können daher als Ausgangspunkt zum Schreiben einer LINQ-Abfrage für die Datenbank verwendet werden. Dies ist nicht der richtige Ort für eine eingehende Diskussion von LINQ, aber hier sind ein paar einfache Beispiele:

using (var context = new BloggingContext())
{
    // Query for all blogs with names starting with B
    var blogs = from b in context.Blogs
                   where b.Name.StartsWith("B")
                   select b;

    // Query for the Blog named ADO.NET Blog
    var blog = context.Blogs
                    .Where(b => b.Name == "ADO.NET Blog")
                    .FirstOrDefault();
}

Beachten Sie, dass DbSet und IDbSet immer Abfragen für die Datenbank erstellen und immer einen Roundtrip zur Datenbank beinhalten, auch wenn die zurückgegebenen Entitäten bereits im Kontext vorhanden sind. Eine Abfrage wird für die Datenbank ausgeführt, wenn:

  • Sie wird durch eine Foreach -Anweisung (C#) oder for Each (Visual Basic) aufgezählt.
  • Sie wird durch einen Sammlungsvorgang wie ToArray, ToDictionary oder ToList aufgezählt.
  • LINQ-Operatoren wie First oder Any werden im äußersten Teil der Abfrage angegeben.
  • Die folgenden Methoden werden aufgerufen: die Load-Erweiterungsmethode für ein DbSet, DbEntityEntry.Reload und Database.ExecuteSqlCommand.

Wenn Ergebnisse aus der Datenbank zurückgegeben werden, werden Objekte, die im Kontext nicht vorhanden sind, dem Kontext angefügt. Wenn sich ein Objekt bereits im Kontext befindet, wird das vorhandene Objekt zurückgegeben (die aktuellen und ursprünglichen Werte der Eigenschaften des Objekts im Eintrag werden nicht mit Datenbankwerten überschrieben).

Wenn Sie eine Abfrage ausführen, werden Entitäten, die dem Kontext hinzugefügt, aber noch nicht in der Datenbank gespeichert wurden, nicht als Teil des Resultsets zurückgegeben. Informationen zum Abrufen der Daten, die sich im Kontext befinden, finden Sie unter "Lokale Daten".

Wenn eine Abfrage keine Zeilen aus der Datenbank zurückgibt, ist das Ergebnis eine leere Auflistung anstelle von NULL.

Suchen nach Entitäten mithilfe von Primärschlüsseln

Die Find-Methode für DbSet verwendet den Primärschlüsselwert, um nach einer Entität zu suchen, die vom Kontext nachverfolgt wird. Wenn die Entität im Kontext nicht gefunden wird, wird eine Abfrage an die Datenbank gesendet, um die Entität dort zu finden. Null wird zurückgegeben, wenn die Entität nicht im Kontext oder in der Datenbank gefunden wird.

Die Suche unterscheidet sich von der Verwendung einer Abfrage auf zwei signifikante Weise:

  • Ein Roundtrip zur Datenbank erfolgt nur, falls die Entität mit dem angegebenen Schlüssel im Kontext nicht vorhanden ist.
  • Find gibt Entitäten zurück, die sich im Status "Hinzugefügt" befinden. Das heißt, Find gibt Entitäten zurück, die dem Kontext hinzugefügt wurden, aber noch nicht in der Datenbank gespeichert wurden.

Suchen einer Entität nach Primärschlüssel

Der folgende Code zeigt einige Verwendungsmöglichkeiten von Find:

using (var context = new BloggingContext())
{
    // Will hit the database
    var blog = context.Blogs.Find(3);

    // Will return the same instance without hitting the database
    var blogAgain = context.Blogs.Find(3);

    context.Blogs.Add(new Blog { Id = -1 });

    // Will find the new blog even though it does not exist in the database
    var newBlog = context.Blogs.Find(-1);

    // Will find a User which has a string primary key
    var user = context.Users.Find("johndoe1987");
}

Suchen einer Entität nach zusammengesetzten Primärschlüsseln

Entity Framework ermöglicht Es Ihren Entitäten, zusammengesetzte Schlüssel zu haben – das ist ein Schlüssel, der aus mehr als einer Eigenschaft besteht. Beispielsweise könnten Sie eine BlogSettings-Entität haben, die eine Benutzereinstellungen für einen bestimmten Blog darstellt. Da ein Benutzer nur über einen BlogSettings für jeden Blog verfügt, könnten Sie den Primärschlüssel von BlogSettings zu einer Kombination aus BlogId und Benutzername machen. Der folgende Code versucht, die BlogSettings mit BlogId = 3 und Username = "johndoe1987" zu finden:

using (var context = new BloggingContext())
{
    var settings = context.BlogSettings.Find(3, "johndoe1987");
}

Beachten Sie, dass Sie bei zusammengesetzten Schlüsseln ColumnAttribute oder die Fluent-API verwenden müssen, um eine Sortierung für die Eigenschaften des zusammengesetzten Schlüssels anzugeben. Der Aufruf von Find muss diese Reihenfolge verwenden, wenn die Werte angegeben werden, die den Schlüssel bilden.