Entity Framework - Projeksiyon Sorguları

LINQ to Entities

LINQ to Entities'i anlamak için en önemli kavramlardan biri, bildirimsel bir dil olmasıdır. Odak noktası, bilgiyi nasıl elde edeceğinizden ziyade hangi bilgilere ihtiyacınız olduğunu belirlemektir.

  • Bu, verilerle çalışmaya daha fazla, veritabanına erişim gibi görevleri gerçekleştirmek için gereken temel kodu anlamaya daha az zaman harcayabileceğiniz anlamına gelir.

  • Bildirimsel dillerin aslında geliştiriciden herhangi bir kontrolü kaldırmadığını anlamak önemlidir, ancak geliştiricinin dikkatini önemli olana odaklamasına yardımcı olur.

LINQ to Entities Essential Keywords

Bir LINQ sorgusu oluşturmak için kullanılan temel anahtar kelimeleri bilmek önemlidir. Hatırlanması gereken yalnızca birkaç anahtar kelime vardır, ancak belirli sonuçları elde etmek için bunları çeşitli şekillerde birleştirebilirsiniz. Aşağıdaki liste, bu temel anahtar kelimeleri içerir ve her birinin basit bir açıklamasını sağlar.

Sr. No. Anahtar Kelime ve Açıklama
1

Ascending

Bir aralığın en küçük (veya en düşük) öğesinden bir aralığın en yüksek öğesine kadar bir sıralama işleminin gerçekleştiğini belirtir. Bu normalde varsayılan ayardır. Örneğin, alfabetik bir sıralama gerçekleştirilirken, sıralama A ile Z arasında olacaktır.

2

By

Bir gruplamayı uygulamak için kullanılan alanı veya ifadeyi belirtir. Alan veya ifade, gruplama görevini gerçekleştirmek için kullanılan bir anahtarı tanımlar.

3

Descending

Bir aralığın en büyük (veya en yüksek) öğesinden aralığın en düşük öğesine kadar bir sıralama işleminin gerçekleştiğini belirtir. Örneğin, alfabetik bir sıralama gerçekleştirilirken, sıralama Z ile A arasında olacaktır.

4

Equals

Birleştirme ifadesinin sol ve sağ cümleleri arasında, birincil bağlamsal veri kaynağını ikincil bağlamsal veri kaynağına birleştirmek için kullanılır. Equals anahtar kelimesinin solundaki alan veya ifade birincil veri kaynağını belirtirken, equals anahtar kelimesinin sağındaki alan veya ifade ikincil veri kaynağını belirtir.

5

From

Gerekli bilgileri elde etmek için kullanılan veri kaynağını belirtir ve bir aralık değişkenini tanımlar. Bu değişken, bir döngüde yineleme için kullanılan bir değişkenle aynı amaca sahiptir.

6

Group

Çıktıyı, belirlediğiniz anahtar değerini kullanarak gruplar halinde düzenler. Birden çok düzeyde çıktı organizasyonu oluşturmak için birden çok grup cümlesi kullanın. Grup cümlelerinin sırası, gruplama sırasında belirli bir anahtar değerinin göründüğü derinliği belirler. Belirli bir bağlam oluşturmak için bu anahtar kelimeyi by ile birleştirirsiniz.

7

In

Çeşitli şekillerde kullanılır. Bu durumda, anahtar sözcük bir sorgu için kullanılan bağlamsal veritabanı kaynağını belirler. Bir birleştirme ile çalışırken, birleştirme için kullanılan her bağlamsal veritabanı kaynağı için in anahtar sözcüğü kullanılır.

8

Into

Join, group ve select gibi LINQ sorgu yan tümceleri için başvuru olarak kullanabileceğiniz bir tanımlayıcı belirtir.

9

Join

Ana / ayrıntı kurulumunda olduğu gibi iki ilgili veri kaynağından tek bir veri kaynağı oluşturur. Bir birleşim, iç birleşim varsayılan olarak bir iç, grup veya sol dış birleşimi belirtebilir. Msdn.microsoft.com adresinde birleştirmeler hakkında daha fazla bilgi edinebilirsiniz.

10

Let

Alt ifade sonuçlarını bir sorgu ifadesinde depolamak için kullanabileceğiniz bir aralık değişkenini tanımlar. Tipik olarak, aralık değişkeni, ek bir numaralandırılmış çıktı sağlamak veya bir sorgunun verimliliğini artırmak için kullanılır (böylece bir dizenin küçük harfli değerini bulmak gibi belirli bir görevin birden fazla kez yapılması gerekmez).

11

On

Bir birleştirmeyi uygulamak için kullanılan alanı veya ifadeyi belirtir. Alan veya ifade, her iki bağlamsal veri kaynağı için ortak olan bir öğeyi tanımlar.

12

Orderby

Sorgu için bir sıralama düzeni oluşturur. Sıralamanın sırasını kontrol etmek için artan veya azalan anahtar kelimeyi ekleyebilirsiniz. Birden çok sıralama düzeyi oluşturmak için birden çok orderby cümlesi kullanın. Orderby yan tümcelerinin sırası, sıralama ifadelerinin işlenme sırasını belirler, bu nedenle farklı bir sıra kullanmak farklı çıktılarla sonuçlanır.

13

Where

LINQ'nun veri kaynağından alması gerekenleri tanımlar. Neyin alınacağının ayrıntılarını tanımlamak için bir veya daha fazla Boole ifadesi kullanırsınız. Boole ifadeleri, && (VE) ve || kullanılarak birbirinden ayrılır. (VEYA) operatörleri.

14

Select

Hangi bilgilerin döndürüleceğini belirterek LINQ sorgusunun çıktısını belirler. Bu ifade, yineleme işlemi sırasında LINQ'nun döndürdüğü öğelerin veri türünü tanımlar.

Projeksiyon

Projeksiyon sorguları, yalnızca veritabanınızdan belirli alanları alarak uygulamanızın verimliliğini artırır.

  • Verilere sahip olduğunuzda, verileri çıktıdan önce şekillendirmek için gerektiği gibi yansıtmak veya filtrelemek isteyebilirsiniz.

  • Herhangi bir LINQ to Entities ifadesinin ana görevi, verileri elde etmek ve çıktı olarak sağlamaktır.

Bu bölümün "LINQ to Entities sorgularının geliştirilmesi" bölümü, bu temel görevi gerçekleştirmek için gereken teknikleri gösterir.

Öğrencilerin listesinin alınacağı aşağıdaki koda bir göz atalım.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students select s;

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }
}

Tek Nesne

Tek bir öğrenci nesnesini almak için, bir dizinin ilk öğesini döndüren First () veya FirstOrDefault numaralandırılabilir yöntemleri kullanabilirsiniz. First ve FirstOrDefault arasındaki fark, sağlanan ölçütler için sonuç verisi yoksa First () bir istisna atarken, sonuç verisi yoksa FirstOrDefault () varsayılan değeri null döndürür. Aşağıdaki kod parçacığında listeden ilk adı Ali olan öğrenci alınacaktır.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).FirstOrDefault<Student>();

   string name = student.FirstMidName + " " + student.LastName;
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
}

Bir sıranın tek, belirli bir öğesini döndüren tek bir öğrenci nesnesi almak için Single () veya SingleOrDefault'u da kullanabilirsiniz. Aşağıdaki örnekte, kimliği 2 olan tek bir öğrenci alınır.

using (var context = new UniContextEntities()) {

   var student = (from s in context.Students where s.ID 
      == 2 select s).SingleOrDefault<Student>();
   string name = student.FirstMidName + " " + student.LastName;
	
   Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   Console.ReadKey();
}

Nesnelerin Listesi

İlk adı Ali olan öğrencilerin listesini almak istiyorsanız ToList () numaralandırılabilir yöntemi kullanabilirsiniz.

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students where s.FirstMidName 
      == "Ali" select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Sipariş

Verileri / listeyi belirli bir sırada almak için anahtar kelimeye göre sıralamayı kullanabilirsiniz. Aşağıdaki kodda, öğrencinin snippet listesi artan sırada alınacaktır.

using (var context = new UniContextEntities()) {

   var studentList = (from s in context.Students orderby
      s.FirstMidName ascending select s).ToList();

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Standard Vs Projection Entity Framework Sorgusu

Diyelim ki, ID, FirstMidName, LastName ve EnrollmentDate içeren bir Öğrenci modeliniz var. Bir Öğrenci listesi döndürmek istiyorsanız, standart bir sorgu tüm alanları döndürür. Ancak yalnızca ID, FirstMidName ve LastName alanlarını içeren öğrencilerin bir listesini almak istiyorsanız. Projeksiyon sorgusu kullanmanız gereken yer burasıdır. Aşağıda, projeksiyon sorgusunun basit bir örneği verilmiştir.

using (var context = new UniContextEntities()) {

   var studentList = from s in context.Students
      orderby s.FirstMidName ascending
      where s.FirstMidName == "Ali"

   select new {s.ID, s.FirstMidName, s.LastName};

   foreach (var student in studentList) {
      string name = student.FirstMidName + " " + student.LastName;
      Console.WriteLine("ID : {0}, Name: {1}", student.ID, name);
   }

   Console.ReadKey();
}

Yukarıdaki projeksiyon sorgusu KayıtTarihi alanını hariç tutar. Bu, uygulamanızı çok daha hızlı hale getirecektir.