Mengkueri dan Menemukan Entitas

Topik ini mencakup berbagai cara untuk mengkueri data menggunakan Entity Framework, termasuk LINQ dan metode Temukan. Teknik yang ditunjukkan dalam topik ini berlaku sama untuk model yang dibuat dengan Perancang EF dan Code First.

Menemukan entitas menggunakan kueri

DbSet dan IDbSet mengimplementasikan IQueryable sehingga dapat digunakan sebagai titik awal untuk menulis kueri LINQ terhadap database. Ini bukan tempat yang tepat untuk diskusi mendalam tentang LINQ, tetapi berikut adalah beberapa contoh sederhana:

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

Perhatikan bahwa DbSet dan IDbSet selalu membuat kueri terhadap database dan akan selalu melibatkan perjalanan bolak-balik ke database meskipun entitas yang dikembalikan sudah ada dalam konteks. Kueri dijalankan terhadap database saat:

  • Kueri dihitung dengan pernyataan foreach (C#) atau For Each (Visual Basic).
  • Kueri dihitung oleh operasi pengumpulan seperti ToArray, ToDictionary, atau ToList.
  • Operator LINQ seperti First atau Any ditentukan di bagian terluar kueri.
  • Metode berikut disebut: metode ekstensi Muat pada DbSet, DbEntityEntry.Reload, dan Database.ExecuteSqlCommand.

Ketika hasil dikembalikan dari database, objek yang tidak ada dalam konteks dilampirkan ke konteks. Jika objek sudah ada dalam konteksnya, objek yang ada akan dikembalikan (nilai saat ini dan asli dari properti objek dalam entri tidak ditimpa dengan nilai database).

Saat Anda melakukan kueri, entitas yang telah ditambahkan ke konteks tetapi belum disimpan ke database tidak dikembalikan sebagai bagian dari kumpulan hasil. Untuk mendapatkan data yang ada dalam konteks, lihat Data Lokal.

Jika kueri tidak mengembalikan baris dari database, hasilnya akan menjadi koleksi kosong, bukan null.

Menemukan entitas menggunakan kunci primer

Metode Temukan di DbSet menggunakan nilai kunci primer untuk mencoba menemukan entitas yang dilacak oleh konteks. Jika entitas tidak ditemukan dalam konteks, kueri akan dikirim ke database untuk menemukan entitas di sana. Null dikembalikan jika entitas tidak ditemukan dalam konteks atau dalam database.

Temukan berbeda dari menggunakan kueri dengan dua cara signifikan:

  • Perjalanan pulang pergi ke database hanya akan dilakukan jika entitas dengan kunci yang diberikan tidak ditemukan dalam konteks.
  • Temukan akan mengembalikan entitas yang berada dalam status Ditambahkan. Artinya, Temukan akan mengembalikan entitas yang telah ditambahkan ke konteks tetapi belum disimpan ke database.

Menemukan entitas menurut kunci primer

Kode berikut menunjukkan beberapa contoh:

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

Menemukan entitas dengan kunci primer komposit

Entity Framework memungkinkan entitas Anda memiliki kunci komposit - itu adalah kunci yang terdiri dari lebih dari satu properti. Misalnya, Anda dapat memiliki entitas BlogSettings yang mewakili pengaturan pengguna untuk blog tertentu. Karena pengguna hanya akan memiliki satu BlogSettings untuk setiap blog, Anda dapat memilih untuk menjadikan kunci utama BlogSettings sebagai kombinasi BlogId dan Username. Kode berikut mencoba menemukan BlogSettings dengan BlogId = 3 dan Nama Pengguna = "johndoe1987":

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

Perhatikan bahwa ketika Anda memiliki kunci komposit, Anda perlu menggunakan ColumnAttribute atau API yang lancar untuk menentukan urutan properti kunci komposit. Panggilan ke Temukan harus menggunakan urutan ini saat menentukan nilai yang membentuk kunci.