Aracılığıyla paylaş


Varlıkları Sorgulama ve Bulma

Bu konu, LINQ ve Find yöntemi de dahil olmak üzere Entity Framework kullanarak veri sorgulamanın çeşitli yollarını ele alır. Bu konu başlığında gösterilen teknikler, gerek Code First gerekse EF Designer ile oluşturulan modellere için geçerlidir.

Sorgu kullanarak varlık bulma

DbSet ve IDbSet, IQueryable'ı uygular ve bu nedenle veritabanına göre LINQ sorgusu yazmak için başlangıç noktası olarak kullanılabilir. Bu konu LINQ'in ayrıntılı olarak tartışılması için uygun yer değildir, ancak aşağıda birkaç basit örnek verilmiştir:

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 ve IDbSet'in her zaman veritabanına göre sorgular oluşturduğunu ve döndürülen varlıklar bağlamda zaten mevcut olsa bile her zaman veritabanına gidiş dönüş olacağını unutmayın. Aşağıdaki durumlarda veritabanında bir sorgu yürütülür:

  • Bir foreach (C#) veya For Each (Visual Basic) deyimi tarafından listelendiğinde.
  • ToArray, ToDictionary veya ToList gibi bir koleksiyon işlemi tarafından listelendiğinde.
  • Sorgunun en dış kısmında First veya Any gibi LINQ işleçleri belirtildiğinde.
  • Şu yöntemler çağrılır: Bir DbSet üzerinde Load uzantı yöntemi, DbEntityEntry.Reload ve Database.ExecuteSqlCommand.

Sonuçlar veritabanından döndürülürken, bağlamda mevcut olmayan nesneler bağlama eklenir. Bir nesne zaten bağlamdaysa, var olan nesne döndürülür (girişteki nesnenin özelliklerinin geçerli ve asıl değerlerinin üzerine veritabanı değerleri yazılmaz).

Sorgu gerçekleştirdiğinizde, bağlama eklenmiş ancak henüz veritabanına kaydedilmemiş varlıklar sonuç kümesinin bir parçası olarak döndürülmez. Bağlamdaki verileri almak için bkz. Yerel Veriler.

Sorgu veritabanından satır döndürmezse, sonuç null yerine boş bir koleksiyon olur.

Birincil anahtar kullanarak varlık bulma

DbSet'te Find yöntemi, bağlam tarafından izlenen bir varlığı bulmayı denemek için birincil anahtar değerini kullanır. Varlık bağlamda bulunamazsa, varlığı orada bulmak için veritabanına bir sorgu gönderilir. Varlık bağlamda veya veritabanında bulunamazsa Null döndürülür.

Find, sorgu kullanmadan iki önemli şekilde farklıdır:

  • Veritabanına gidiş dönüş yalnızca verilen anahtara sahip varlık bağlamda bulunamazsa yapılır.
  • Find, Added durumundaki varlıkları döndürür. Diğer bir ifadeyle, Find bağlama eklenmiş ancak henüz veritabanına kaydedilmemiş varlıkları döndürür.

Birincil anahtara göre varlık bulma

Aşağıdaki kod, Find'ın bazı kullanımlarını göstermektedir:

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

Bileşik birincil anahtara göre varlık bulma

Entity Framework, varlıklarınızın bileşik anahtarlara sahip olmasını sağlar. Bu, birden fazla özellikten oluşan bir anahtardır. Örneğin, belirli bir blog için kullanıcı ayarlarını temsil eden bir BlogSettings varlığınız olabilir. Kullanıcı her blog için yalnızca bir BlogSettings'i olacağından, BlogSettings'in birincil anahtarını BlogId ve Username değerlerinin bir bileşimi yapabilirsiniz. Aşağıdaki kod, BlogId = 3 ve Username = "johndoe1987" değerleri ile BlogSettings'i bulmaya çalışmaktadır:

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

Bileşik anahtarlarınız olduğunda, bileşik anahtarın özellikleri için bir sıralama belirtmek üzere ColumnAttribute'u veya fluent API'sini kullanmanız gerektiğini unutmayın. Find çağrısı, anahtarı oluşturan değerleri belirtirken bu sırayı kullanmalıdır.