18 Ağustos 2009

.Net Compact Framework 3.5 – LINQ Uygulamaları – Standart Query Operators

Hiç şüphesiz .Net Compact Framework 3.5 ile birlikte gelen “sınırlı” LINQ (Language Integrated Query) desteği .Net Compact Framework managed mobil cihaz uygulama geliştiricilerin uygulama geliştirme sürecini ciddi anlamda kolaylaştıran en önemli yeniliklerin başında ifade edilebilmektedir. .Net Framework 3.5 ile birlikte uygulama geliştirme ortamında yerini bulan ve günümüzde bakıldığında üzerine onlarca “Provider” geliştirilen LINQ, birçok yazılım geliştiricinin yazılım geliştirme sürecini hızlandırmakta, okunması, anlaşılması ve yazılması her zaman daha sevimli ve daha kolay olan “sql-tipi” sorgulama modelini .Net ortamına getirmektedir. .Net Uygulama Geliştirme platformu üzerinde resmi dil olarak kabul edilen C# (C-Sharp) ve VB.NET (Visual Basit .Net) programlama dilleri kullanılarak, bu dillerin compiler (derleyici)’ ları üzerinde yapılan geliştirmeler sonucunda uygulama geliştiriciler birçok farklı “veri setine” “doğal yöntemlerle” ulaşabilmekte ve bu verileri “doğal yöntemlerle” sorgulayabilmektedir. Doğal yöntemler olarak katedilen metoloji, hali hazırda veri sorgulama işlemlerinde kullanıyor olduğumuz select, from, join, where v.b. gibi sorgulama kelimelerinin programatik ortamda kullanılmasıdır. LINQ (Language Integraed Query), temelinde bize bu olanağı sağlamakta, derleyicilere bu yeteneği kazandırmaktadır. Bir diğer bakış açısıyla LINQ, IEnumerable (Tahmin edin bu arayüzü kaç sınıf implement etmekte ve kaç arayüz bu arayüzden kalıtım almakta) kaynaklı tüm koleksiyonları sorgulamamıza olanak sağlamaktadır.

Örneğin ;



kod satırları string bir dizi üzerinde dizi elemanlarının metinsel uzunluğu 3 karakterden fazla olan elemanları listelemesini öngörmektedir.

LINQ ile iki farklı metodoloji ile sorgulama gerçekleştirebilmekteyiz. Bunlardan ilki yukarıdaki ekran görüntüsünde ifade edilen ve “Query Expression” olarak tabir edilen native keyword’ ler ile sorgulama yapmak, diğeri ise “aslında yukarıdaki yazılanların da derleme zamanında otomatik olarak uygun olan Extension Method’ lara çevrildiği” metot çağrıları ile sorgulama yapmaktır. Örneğin yukarıdaki sorguyu ;



Şeklinde de çalıştırabilmekteyiz.

Evet, LINQ çağrıları derleme anında IEnumerable tipi için .Net Framework 3.5 üzerinde tanımlanan Extension method çağrılarına dönüştürülmekte ve sonuçlar üretilmektedir. Bu Extension Method’ larının kullanılabilmesi için uygulama içerisine System.Linq referansının eklenmesi ve bu referansın kod ekranı üzerinde “using” ile belirtilmesi gerekmektedir.
Referanslardan ilgili referansı eklemeli ;



Ve System.Linq ‘ i kod ekranına “using” ile tanımlamamız gerekmektedir.



Peki IEnumerable üzerinde tanımlı Extension Method’ lar nelerdir ? Bu sonuca ulaşabilmenin onlarca yöntemi bulunmaktadır. En kolayı uygulama geliştirme ortamında System.Linq.Enumerable üzerine sağ tıklamak ve “Go To Definition” seçeneğine tıklayarak metadata üzerinden bu listeye ulaşmaktadır.



“LINQ Standart Query Operators” olarak adlandırılan bu fonksiyon seti, temel olarak bir veri seti üzerinde ihtiyaç duyulabilecek neredeyse tüm işlemleri gerçekleştirmeye yarayan “Extension Method" ' lardan oluşmaktadır. Bu setin içideki tüm fonksiyonların ne işe yaradığını
http://msdn.microsoft.com/en-us/library/system.linq.enumerable_members.aspx adresinden detaylıca öğrenebilirsiniz.

Bütün bunların dışında yazının başında da belirttiğimiz üzere LINQ’ in bize sunduğu Iqueryable arayüzü sayesinde LINQ ile onlarca veri kaynağını sorgulayabileceğimiz sanal “LINQ Provider” ‘ ları oluşturabilmekteyiz. LINQ, standart olarak memory üzerinde konumlandırılmış olan koleksiyonlar sorgulayabilecek LINQ To Objects, Sql Server üzerinde tanımlı olan bir veritabanını sorgulayabilecek LINQ To SQL, Xml içerikli dosyaları, verileri sorgulayabilecek LINQ To XML, Ado.Net Entity Framework altyapısını kullanarak Entity objelerimizi sorgulayabilecek LINQ To Entities, Dataset + Datatable objelerini direk sorgulayabileceğimiz LINQ To Dataset gibi 10’ a yakın provider ile gelmekte, ve gün geçtikçe farklı veri kaynakları için yeni provider’ lar geliştirilmektedir. Bu bağlamda bakıldığında LINQ uygulama geliştiricilere ciddi bir kapı aralamış ve uygulama geliştirme süreçlerini hızlandırmıştır.

Hızlı bir şekilde yazımızın ana konusuna dönersek, bu yazımızda .Net Compact Framework 3.5 ile birlikte “artık” desteklenen, mobil cihaz uygulama geliştiricilerin bu platform üzerinde kullanabilecekleri LINQ implemantasyonundan bahsedeceğiz.
.Net Compact Framework 3.5 ile artık masaüstü LINQ’ in “kısıtlı, belirli bir bölümünü” mobil cihaz uygulamaları geliştirirken kullanabilmekteyiz. .Net Compact Framework 3.5 üzerinde sadece ;

Standart Query Operators
LINQ To Dataset
LINQ To XML

desteklenmektedir.

Standart Query Operators
Yazımızın bir önceki bölümünde bahsettiğimiz üzere LINQ içerisinde Standart Query Operators başlığı altında IEnumerable arayüzü için hazırlanmış bir dizi extension method bulunmaktadır. Bu methodlar genel olarak “veri üzerinde standart işlemler” olarak tâbir ettiğimiz arama, sayma, filtreleme, seçme v.b. gibi işlemleri gerçekleştirmeye yarayan method’ lardır. Method’ ların tek tek kullanımını bu noktada belirtmek çok mantıksız olur. Belirli amaçlara yönelik birkaç method’ un kullanımından bahsetmek, diğerlerinin öğrenilmesine yol açmak şahsen daha mantıklı olacaktır. :)

Hiç vakit kaybetmeden birkaç örnek üzerine çalışalım. Örneğimizde Sql Server Compact Edition 3.5 sürümü üzerinde hazırlanmış Northwind.sdf isimli veritabanı üzerinden Customers tablosuna ait veriler çekiliyor ve çekilen her satır uygulama içerisinde bir Customer entity instance’ ı olarak temsil ediliyor. Bu noktada hazırlanan alt yapıyı örnek kodları indirerek inceleyebilirsiniz.



Entity klasörü içerisindeki Customer sınıfı, veritabanı üzerindeki bir Customer kaydını temsil edecek şekilde modellenmiştir.



Business klasörü içerisindeki Customer sınıfı ise Northwind.sdf üzerinden tüm müşteri kayıtlarını Ilist tipinde döndürmeye yarayacak bir fonksiyona sahiptir.



Bu noktada kodların tamamına örnek kodları indirerek ulaşabilirsiniz. Verilerin getirilmesinde SqlCe Provider’ ı kullanışmıştır.

Sıra geldi bu verileri çekip, üzerinde sorgulama yapmaya. Bu noktada bize yardımcı olması adına uygulamamıza bir Form ekliyoruz ve Form Load olayı tetiklendiğinde aşağıdaki kod bloğunu çalıştırıyoruz.



Ve verilerimiz artık elimizde. Bu noktadan sonra elimizdeki Customers list’ i üzerinde Standart Query Operators ‘ ı kullanarak birçok işlem gerçekleştirebiliriz. Sonucta IList arayüzü içeriğine bakıldığında IEnumerable arayüzünden kalıtım almaktadır. Dolayısıyla IEnumerable için hazırlanmış tüm Extension Method’ lar IList içinde geçerlidir.
Form üzerine bir button yerleştirip bu button’ a tıkladığımızda açılan kod bloğu içerisinde Customers yazıp noktaya basıyoruz ve gerçekleştirebilecek olduğumuz işlemlerin bir listesini görüntülüyoruz.



İşte karşımızda Extension Method’ lar ya da bir diğer deyimiyle Standart Query Operators ! İkonunda aşağı doğru bakan mavi renkli ok işaratei bulunanlar Extension Method olarak ifade edilebilir.

Sıra geldi bu fonksiyonların etinden sütünden faydalanmaya. Bilindiği üzere LINQ üzerinde iki tip sorgulama yöntemi bulunmaktadır. Query Expressions ve Method Calls. Siz, bazı operatörleri method çağrıları şeklinde çağırmak yerine LINQ’ in “doğal yöntemi” ile sorgulayabilirsiniz. Bunu yazımızın başında ifade etmiştik.

Query Expression modelinde hangi keyword’ lerin kullanılabileceğini ise
http://msdn.microsoft.com/en-us/library/bb882642.aspx adresinden inceleyebilir, yazdığınız kelimelerin compile time’ da hangi method çağrılarına dönüştürüldüğünü, hangilerini sadece methodlar kullanarak çağırabileceğinizi bu listeden görebilirsiniz. Ayrıca C#’ ta olmayan bazı keyword’ ler VB.Net üzerinde bulunmaktadır. J Microsoft’ un önerisi, okunması her açıdan kolay olan Query Expression’ ları olabildiğince kullanmamızdır. Sonuçta compile time’ da her ikiside aynı IL koduna dönüştürüldüğünden aralarında hiç bir performans farkı bulunmamaktadır. Ayrıca bilindiği üzere Query Expression’ lar çok sınırlı bir keyword listesini desteklemekte. Siz sıkıştığınız noktalarda bu expressionları method çağrıları ile birleştirip hibrit sorgulamalar gerçekleştirebilirsiniz. Örneğin ;



Yukarıdaki kod bloğunda Berlin şehrinde yaşayan müşterilerimizin ContactTitle bilgisini seçtikten sonra normal şartlarda C# üzerinden Query Expression yöntemi ile gerçekleştirilemeyen Distinct çağrısını Extension Method çağrısı ile gerçekleştirmiş bulunmaktayız.

Biraz sorgulama gerçekleştirelim.



Sorguda veri kaynağı üzerinden gelen müşterileri yaşadıkları ülkelere göre grupladık. Gruplamanın sonucunda ise anonim bir tip oluşturduk ve bu tipe 2 adet özellik tanımladık. Hangi şehir bilgisi ve bu şehirde yaşayan müşterilerin sayısı.



Örneğin yukarıdaki sorguda Adres’ i A harfiyle başlayan müşterileri listeledik.

Kısacası elinizdeki verilerin yoğunluğu, aralarındaki ilişkiler ve daha birçok noktayı da göz önünde bulundurarak, .Net Compact Framework 3.5 kullanarak geliştirdiğiniz Mobil Cihaz Uygulamalarında Standart Query Operators olarak ifade edilen bu keyword ve fonksiyonları kullanarak LINQ’ in gücünü hissedebilirsiniz. Bir sonraki yazımızda .Net Compact Framework üzerinde LINQ To Dataset kavramını örneklerle inceleyeceğiz.

Geliştirilen örnek uygulamanın kodlarını buradan indirebilirsiniz.

Hiç yorum yok:

Yorum Gönder