Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
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.