Wykonywanie zapytań i znajdowanie jednostek

W tym temacie opisano różne sposoby wykonywania zapytań dotyczących danych przy użyciu platformy Entity Framework, w tym LINQ i metody Find. Techniki przedstawione w tym temacie mają zastosowanie w równym stopniu do modeli utworzonych przy użyciu funkcji Code First i projektanta EF.

Znajdowanie jednostek przy użyciu zapytania

Zestaw dbSet i IDbSet implementują funkcję IQueryable i dlatego mogą być używane jako punkt wyjścia do pisania zapytania LINQ względem bazy danych. Nie jest to właściwe miejsce do szczegółowej dyskusji na temat LINQ, ale oto kilka prostych przykładów:

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

Należy pamiętać, że DbSet i IDbSet zawsze tworzą zapytania do bazy danych i wymagają komunikacji z bazą danych, nawet jeśli obiekty zwrócone już istnieją w kontekście. Zapytanie jest wykonywane względem bazy danych, gdy:

  • Jest on wyliczany przez instrukcję foreach (C#) lub For Each (Visual Basic).
  • Jest on wyliczany przez operację kolekcji, taką jak ToArray, ToDictionary lub ToList.
  • Operatory LINQ, takie jak First lub Any , są określone w najbardziej zewnętrznej części zapytania.
  • Wywoływane są następujące metody: metoda rozszerzenia Load w dbSet, DbEntityEntry.Reload i Database.ExecuteSqlCommand.

Gdy wyniki są zwracane z bazy danych, obiekty, które nie istnieją w kontekście, są dołączone do kontekstu. Jeśli obiekt znajduje się już w kontekście, zwracany jest istniejący obiekt (bieżące i oryginalne wartości właściwości obiektu we wpisie nie są zastępowane wartościami bazy danych).

Podczas wykonywania zapytania jednostki, które zostały dodane do kontekstu, ale nie zostały jeszcze zapisane w bazie danych, nie są zwracane w ramach zestawu wyników. Aby uzyskać dane, które są w kontekście, zobacz Dane lokalne.

Jeśli zapytanie nie zwraca żadnych wierszy z bazy danych, wynikiem będzie pusta kolekcja, a nie null.

Znajdowanie jednostek przy użyciu kluczy podstawowych

Metoda Find w zestawie dbSet używa wartości klucza podstawowego do próby znalezienia jednostki śledzonej przez kontekst. Jeśli jednostka nie zostanie znaleziona w kontekście, zapytanie zostanie wysłane do bazy danych, aby znaleźć tam jednostkę. Wartość Null jest zwracana, jeśli jednostka nie zostanie znaleziona w kontekście lub w bazie danych.

Funkcja Find różni się od używania zapytania na dwa istotne sposoby:

  • Zapytanie do bazy danych będzie miało miejsce tylko wtedy, gdy encja z danym kluczem nie zostanie znaleziona w kontekście.
  • Funkcja Find zwróci jednostki, które znajdują się w stanie Dodano. Oznacza to, że funkcja Find zwróci jednostki, które zostały dodane do kontekstu, ale nie zostały jeszcze zapisane w bazie danych.

Znajdowanie jednostki według klucza podstawowego

Poniższy kod przedstawia niektóre zastosowania funkcji 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");
}

Znajdowanie jednostki według złożonego klucza podstawowego

Platforma Entity Framework umożliwia jednostkom posiadanie kluczy złożonych — jest to klucz składający się z więcej niż jednej właściwości. Możesz na przykład mieć jednostkę BlogSettings reprezentującą ustawienia użytkowników dla określonego bloga. Ponieważ użytkownik ma tylko jedno ustawienie BlogSettings dla każdego bloga, można wybrać klucz podstawowy BlogSettings jako kombinację BlogId i NazwaUżytkownika. Poniższy kod próbuje znaleźć blogSettings z identyfikatorem BlogId = 3 i nazwą użytkownika = "johndoe1987":

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

Należy pamiętać, że jeśli masz klucze złożone, musisz użyć atrybutu ColumnAttribute lub płynnego interfejsu API, aby określić kolejność właściwości klucza złożonego. Wywołanie funkcji Znajdź musi używać tej kolejności podczas określania wartości, które tworzą klucz.