Entiteiten opvragen en zoeken

In dit onderwerp worden de verschillende manieren besproken waarop u query's kunt uitvoeren op gegevens met Behulp van Entity Framework, waaronder LINQ en de methode Find. De technieken die in dit onderwerp worden weergegeven, zijn evenzeer van toepassing op modellen die zijn gemaakt met Code First en de EF Designer.

Entiteiten zoeken met behulp van een query

DbSet en IDbSet implementeren IQueryable en kunnen dus worden gebruikt als uitgangspunt voor het schrijven van een LINQ-query voor de database. Dit is niet de juiste plaats voor een diepgaande bespreking van LINQ, maar hier volgen enkele eenvoudige voorbeelden:

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();
}

DbSet en IDbSet maken altijd query's voor de database en hebben altijd betrekking op een retour naar de database, zelfs als de geretourneerde entiteiten al bestaan in de context. Een query wordt uitgevoerd op de database wanneer:

  • Deze wordt geïnventariseerd door een foreach -instructie (C#) of Voor elke (Visual Basic)-instructie.
  • Het wordt geïnventariseerd door een verzamelingsbewerking zoals ToArray, ToDictionary of ToList.
  • LINQ-operators, zoals First of Any , worden opgegeven in het buitenste deel van de query.
  • De volgende methoden worden aangeroepen: de methode Load Extension op een DbSet, DbEntityEntry.Reload en Database.ExecuteSqlCommand.

Wanneer resultaten worden geretourneerd uit de database, worden objecten die niet in de context aanwezig zijn, gekoppeld aan de context. Als een object al in de context staat, wordt het bestaande object geretourneerd (de huidige en oorspronkelijke waarden van de eigenschappen van het object in de vermelding worden niet overschreven met databasewaarden).

Wanneer u een query uitvoert, worden entiteiten die zijn toegevoegd aan de context, maar die nog niet zijn opgeslagen in de database, niet geretourneerd als onderdeel van de resultatenset. Zie Lokale gegevens om de gegevens op te halen die zich in de context bevinden.

Als een query geen rijen uit de database retourneert, is het resultaat een lege verzameling in plaats van null.

Entiteiten zoeken met behulp van primaire sleutels

De methode Zoeken op DbSet maakt gebruik van de primaire-sleutelwaarde om te proberen een entiteit te vinden die wordt bijgehouden door de context. Als de entiteit niet in de context wordt gevonden, wordt er een query naar de database verzonden om de entiteit daar te vinden. Null wordt geretourneerd als de entiteit niet wordt gevonden in de context of in de database.

Zoeken verschilt van het gebruik van een query op twee belangrijke manieren:

  • Er wordt alleen een aanroep naar de database uitgevoerd als de entiteit met de opgegeven sleutel niet in de context wordt gevonden.
  • Zoeken retourneert entiteiten die de status Toegevoegd hebben. Dat wil gezegd: Zoeken retourneert entiteiten die zijn toegevoegd aan de context, maar die nog niet zijn opgeslagen in de database.

Een entiteit zoeken op primaire sleutel

De volgende code toont enkele toepassingen van 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");
}

Een entiteit zoeken op samengestelde primaire sleutel

Met Entity Framework kunnen uw entiteiten samengestelde sleutels hebben. Dit is een sleutel die bestaat uit meer dan één eigenschap. U kunt bijvoorbeeld een BlogSettings-entiteit hebben die een gebruikersinstellingen voor een bepaalde blog vertegenwoordigt. Omdat een gebruiker slechts één BlogSettings voor elke blog zou hebben, kunt u ervoor kiezen om de primaire sleutel van BlogSettings een combinatie van BlogId en Username te maken. Met de volgende code wordt geprobeerd de BlogSettings te vinden met BlogId = 3 en Username = "johndoe1987":

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

Wanneer u samengestelde sleutels hebt, moet u ColumnAttribute of de Fluent-API gebruiken om een volgorde op te geven voor de eigenschappen van de samengestelde sleutel. De aanroep naar Zoeken moet deze volgorde gebruiken bij het opgeven van de waarden die de sleutel vormen.