Att göra förfrågningar och söka entiteter

Det här avsnittet beskriver olika sätt att fråga efter data med Entity Framework, inklusive LINQ och metoden Find. De tekniker som visas i det här avsnittet gäller lika för modeller som skapats med Code First och EF Designer.

Hitta entiteter med hjälp av en fråga

DbSet och IDbSet implementerar IQueryable och kan därför användas som utgångspunkt för att skriva en LINQ-fråga mot databasen. Det här är inte rätt plats för en djupgående diskussion om LINQ, men här är några enkla exempel:

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

Observera att DbSet och IDbSet alltid skapar frågor mot databasen och alltid innebär en tur och retur till databasen även om de entiteter som returneras redan finns i kontexten. En fråga körs mot databasen när:

  • Den räknas upp av en foreach (C#) eller For Each (Visual Basic)-instruktion.
  • Den räknas upp av en samlingsåtgärd som ToArray, ToDictionary eller ToList.
  • LINQ-operatorer som First eller Any anges i den yttersta delen av frågan.
  • Följande metoder kallas: metoden Load extension på en DbSet, DbEntityEntry.Reload och Database.ExecuteSqlCommand.

När resultaten returneras från databasen kopplas objekt som inte finns i kontexten till kontexten. Om ett objekt redan finns i kontexten returneras det befintliga objektet (de aktuella och ursprungliga värdena för objektets egenskaper i posten skrivs inte över med databasvärden).

När du utför en fråga returneras inte entiteter som har lagts till i kontexten men som ännu inte har sparats i databasen som en del av resultatuppsättningen. Information om hur du hämtar data som finns i kontexten finns i Lokala data.

Om en fråga inte returnerar några rader från databasen blir resultatet en tom samling i stället för null.

Hitta entiteter med hjälp av primära nycklar

Metoden Find på DbSet använder det primära nyckelvärdet för att försöka hitta en entitet som spåras av kontexten. Om entiteten inte hittas i kontexten skickas en fråga till databasen för att hitta entiteten där. Null returneras om entiteten inte hittas i kontexten eller i databasen.

Hitta skiljer sig från att använda en fråga på två viktiga sätt:

  • En tur-och-retur-resa till databasen görs endast om entiteten med den angivna nyckeln inte hittas i kontexten.
  • Find returnerar entiteter som är i tillståndet Lägg till. Det vill: Find returnerar entiteter som har lagts till i kontexten men som ännu inte har sparats i databasen.

Hitta en entitet efter primärnyckel

Följande kod visar några användningsområden för 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");
}

Hitta en entitet efter sammansatt primärnyckel

Entity Framework gör att dina entiteter kan ha sammansatta nycklar – det är en nyckel som består av mer än en egenskap. Du kan till exempel ha en BlogSettings-entitet som representerar användarinställningar för en viss blogg. Eftersom en användare bara skulle ha en BlogSettings för varje blogg kan du välja att göra den primära nyckeln i BlogSettings en kombination av BlogId och Användarnamn. Följande kod försöker hitta BlogSettings med BlogId = 3 och Username = "johndoe1987":

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

Observera att när du har sammansatta nycklar måste du använda ColumnAttribute eller fluent-API:et för att ange en ordning för egenskaperna för den sammansatta nyckeln. Anropet till Find måste använda den här ordningen när du anger de värden som utgör nyckeln.