Abfragen und Suchen von EntitätenQuerying and Finding Entities

Dieses Thema behandelt die verschiedenen Methoden, mit denen Sie Daten über Entity Framework abfragen können, einschließlich LINQ und der Find-Methode.This topic covers the various ways you can query for data using Entity Framework, including LINQ and the Find method. Die in diesem Thema dargestellten Techniken gelten jeweils für Modelle, die mit Code First und dem EF-Designer erstellt wurden.The techniques shown in this topic apply equally to models created with Code First and the EF Designer.

Suchen von Entitäten über eine AbfrageFinding entities using a query

DbSet und IDbSet implementieren IQueryable, was als Startpunkt zum Schreiben einer LINQ-Abfrage für die Datenbank verwendet werden kann.DbSet and IDbSet implement IQueryable and so can be used as the starting point for writing a LINQ query against the database. In diesem Artikel wird LINQ nicht ausführlich erläutert, jedoch finden Sie nachstehend einige einfache Beispiele:This is not the appropriate place for an in-depth discussion of LINQ, but here are a couple of simple examples:

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 mit sich bringen, auch wenn die zurückgegebenen Entitäten bereits im Kontext vorhanden sind.Note that DbSet and IDbSet always create queries against the database and will always involve a round trip to the database even if the entities returned already exist in the context. Eine Abfrage wird für die Datenbank ausgeführt, wenn:A query is executed against the database when:

  • Sie durch eine foreach-Anweisung (C#) oder eine ForEach-Anweisung (Visual Basic) aufgezählt wird.It is enumerated by a foreach (C#) or For Each (Visual Basic) statement.
  • Sie wird von einem Auflistungsvorgang wie ToArray, ToDictionary oder ToList aufgelistet.It is enumerated by a collection operation such as ToArray, ToDictionary, or ToList.
  • LINQ-Operatoren, wie beispielsweise First oder Any, werden im äußersten Teil der Abfrage angegeben.LINQ operators such as First or Any are specified in the outermost part of the query.
  • Die folgenden Methoden werden aufgerufen: die Erweiterungsmethode Load (auf einem DBSet), DbEntityEntry.Reload und Database.ExecuteSqlCommand.The following methods are called: the Load extension method on a DbSet, DbEntityEntry.Reload, and Database.ExecuteSqlCommand.

Wenn Ergebnisse von der Datenbank zurückgegeben werden, werden Objekte, die nicht im Kontext vorhanden sind, an den Kontext angefügt.When results are returned from the database, objects that do not exist in the context are attached to the context. Wenn sich ein Objekt bereits im Kontext befindet, wird das vorhandene Objekt zurückgegeben (die aktuellen und ursprünglichen Werte der Objekteigenschaften im Eintrag werden nicht mit Datenquellenwerten überschrieben).If an object is already in the context, the existing object is returned (the current and original values of the object's properties in the entry are not overwritten with database values).

Wenn Sie eine Abfrage ausführen, werden Entitäten, die zum Kontext hinzugefügt wurden, jedoch nicht auf der Datenbank gespeichert wurden, nicht als Teil des Resultsets zurückgegeben.When you perform a query, entities that have been added to the context but have not yet been saved to the database are not returned as part of the result set. Unter Entity Framework Local Data (Lokale Daten von Entity Framework) erhalten Sie Informationen zum Abrufen von Daten, die sich im Kontext befinden.To get the data that is in the context, see Local Data.

Wenn eine Abfrage keine Zeilen aus der Datenbank zurückgibt, ist das Ergebnis eine leere Sammlung anstatt NULL.If a query returns no rows from the database, the result will be an empty collection, rather than null.

Suchen von Entitäten über PrimärschlüsselFinding entities using primary keys

Die Find-Methoden auf DbSet verwendet den Primärschlüsselwert, um eine Entität, die vom Kontext nachverfolgt wird, zu finden.The Find method on DbSet uses the primary key value to attempt to find an entity tracked by the context. Wenn die Entität im Kontext nicht gefunden wird, wird eine Abfrage an die Datenbank gesendet, um dort die Entität zu suchen.If the entity is not found in the context then a query will be sent to the database to find the entity there. Wenn die Entität nicht im Kontext oder in der Datenbank gefunden wird, wird NULL zurückgegeben.Null is returned if the entity is not found in the context or in the database.

„Find“ unterscheidet sich von der Verwendung einer Abfrage in zwei Punkten:Find is different from using a query in two significant ways:

  • Es wird nur ein Roundtrip zur Datenbank durchgeführt, wenn die Entität im angegebenen Schlüssel nicht im Kontext gefunden wird.A round-trip to the database will only be made if the entity with the given key is not found in the context.
  • „Find“ gibt Entitäten zurück, die den Zustand „Added“ (Hinzugefügt) aufweisen.Find will return entities that are in the Added state. Das bedeutet, dass „Find“ Entitäten zurückgibt, die zum Kontext hinzugefügt, jedoch noch nicht in der Datenbank gespeichert wurden.That is, Find will return entities that have been added to the context but have not yet been saved to the database.

Suchen nach einer Entität nach PrimärschlüsselnFinding an entity by primary key

Der folgende Code zeigt einige Verwendungsmöglichkeiten für „Find“:The following code shows some uses of 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 nach einer Entität nach zusammengesetztem Primärschlüsseln (Verbundprimärschlüssel)Finding an entity by composite primary key

Entity Framework lässt zusammengesetzte Schlüssel für Ihre Entität zu. Diese sind Schlüssel, die aus mehr aus einer Eigenschaft bestehen.Entity Framework allows your entities to have composite keys - that's a key that is made up of more than one property. Sie verfügen z.B. über die Entität „BlogSettings“, die eine Benutzereinstellung für einen bestimmten Blog darstellt.For example, you could have a BlogSettings entity that represents a users settings for a particular blog. Da ein Benutzer immer nur eine BlogSettings-Entität für jeden Blog besitzen würde, könnten Sie aus dem Primärschlüssel von BlogSettings eine Kombination aus BlogId und Benutzername machen.Because a user would only ever have one BlogSettings for each blog you could chose to make the primary key of BlogSettings a combination of BlogId and Username. Durch folgenden Code wird versucht, BlogSettings mit BlogId = 3 und Benutzername = „johndoe1987“ zu finden.The following code attempts to find the BlogSettings with BlogId = 3 and Username = "johndoe1987":

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

Wenn Sie über zusammengesetzte Schlüssel verfügen, dann beachten Sie, dass Sie das ColumnAttribute oder die Fluent-API verwenden müssen, um eine Reihenfolge für die Eigenschaften der zusammengesetzten Schlüssel anzugeben.Note that when you have composite keys you need to use ColumnAttribute or the fluent API to specify an ordering for the properties of the composite key. Der Aufruf von „Find“ muss diese Reihenfolge verwenden, wenn die Werte, aus denen der Schlüssel besteht, angegeben werden.The call to Find must use this order when specifying the values that form the key.