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.