Abdurrahman KÖKEN | BLOG

just a developer... | Microsoft Student Partner

LINQ ve Extension Metod Aşkı

Nisan 18
by Abdurrahman Köken 18. Nisan 2010 01:40

Geçenlerde bitirme projemle uğraşırken LINQ teknolojisini ve Extension Metodlarını oldukça sık kullandığımı farkettim. Geriye dönüp baktığımda yazdığım kodları linq kullanmadan yazmaya kalkınca gerçekten de ne kadar vakit kazandığımın bir daha farkına vardım.Projemden örnek vermek gerekirse aşağıdaki gibi bir soru sınıfım var.Her soru bu QuizQuestion sınıfı ile temsil ediliyor.Soruların bulunduğu bir listeden hangi soruların sorulup hangilerinin sorulmadığını bulup sorulmayanları seçmek için iki yöntemi aşağıda bulabilirsiniz.

 

Normal hali:

List<QuizQuestion> sorular = GetQuestions();

List<QuizQuestion> sorulmayanlar = new List<QuizQuestion>();

foreach (QuizQuestion soru in sorular)  

{         

if (soru.Asked==false)

       {

             sorulmayanlar.Add(soru); 

        }  

} 

Linq ile yazılmış hali:

List<QuizQuestion> sorular = new List<QuizQuestion>();

List<QuizQuestion> sorulmayanlar = sorular.Where(q => q.Asked == false).ToList(); 

Gördüğünüz gibi fark ortada.Tabi burada basit düşünmemek lazım çok daha  büyük ve karmaşık projelerde asıl faydası ortaya çıkacaktır.

İyi ki varsın LINQ!

 

LINQ to SQL-Veritabanına Dosya Kaydetme ve Okuma

Ocak 13
by Abdurrahman Köken 13. Ocak 2010 14:44

LINQ to SQL , SQL Server’ın varbinary tipini desteklemektedir.Bu sayede veritabana binary olarak dosyalarımızı kaydedebiliriz.Örneğin bir web sitesinde veritabanına kullanıcı profil resimlerininin path’ini  kaydetmek yerine resmi binary olarak kaydedebiliriz.

Veritabanına dosya kaydetme

İlk olarak veritabanımızı oluşturmamız gerekli.Ben kendi veritabanımda Store isimli bir tablo oluşturdum.Tablonun design’ı aşağıdaki gibidir.

Store tablomu tasarladıktan sonra projeme Add New Item diyerek yeni bir LINQ to SQL sınıfı ekliyorum.Daha sonra Server Explorer penceresinden Store tablomu bu sınıfa sürükleyip bırakıyorum.Bu sayfayı kaydedip çıktıktan sonra  sıra geldi dosyamızı veritabanına kaydetmeye.Aşağıdaki kod ile artık dosyamızı veritabanına binary olarak kaydedebiliriz.

NorthWindDataContext ctx = new NorthWindDataContext();

//Store tipinde yeni bir Entity oluşturuyoruz

var stored = new Store();

//Kaydedilecek resmin yolu

string path = @"C:\Users\KullanıcıAdı\Desktop\lf.jpg";

//Kaydedilecek dosyayı byte dizi şeklinde okuyoruz

stored.Binary = File.ReadAllBytes(path);

//Dosyamızın ismini alıp kaydediyoruz

stored.Filename = Path.GetFileName(path);

//Artık oluşturduğumuz entity'yi veritabanına ekliyoruz

ctx.Stores.InsertOnSubmit(stored);

//DataContex'imizde değişiklik olduğu için

//bu değişikliği veritabanına kaydediyoruz

ctx.SubmitChanges(); 

Yukarıdaki kodun gayet açık olduğunu düşünüyorum üstelik her satırın ne iş yaptığını yorum satırlarında da belirttim.İsterseniz bir de kaydettiğimiz bu verileri veritabanından nasıl çekeceğimize bakalım.

Veritabanından binary dosya okuma

Binary olarak kaydettiğimiz verileri diske geri yazmak da kaydetmek kadar kolay.Bunu yaparken ToArray() metodu çok işimize yarayacak:)

string path = @"C:\temp";

var file = p.Stores.First();

File.WriteAllBytes(Path.Combine(path, file.Filename), file.Binary.ToArray());        

Gördüğünüz gibi birkaç satırla  veritabanına kaydettiğimiz binary dosyamızı diske geri yazabiliriz.File sınıfının WriteAllBytes metodunu ve ToArray metodu ile bunu yapabiliriz.Önemli bir nokta veritabanında binary tipinde bir kolon oluşturduğunuzda max 8000 olduğudur.Eğer büyük bir dosya kaydetmeye çalışırsanız “binary data would be truncated” şeklinde bir hata alırsınız.Binary datanın küçültülmesi gerektiği uyarısını veren bu hatayı almamak için önce dosya boyutu kontrolü yapmanızı tavsiye ederim.Kolay gelsin.

  

LINQ-Son N Kaydı Getirme

Ağustos 24
by Abdurrahman Köken 24. Ağustos 2009 14:19

Bu yazımda projelerimde  çok işime yarayan bir LINQ sorgusundan bahsetmek istiyorum.Bir veri kaynağından o kaynaktaki son n tane kaydı çeken bir sorgu yazacağız.Dilerseniz bir Console uygulaması oluşturup örneğimize başlayalım.Örneğimizde bir önceki linq makalemdeki gibi Person tipinde nesneleri barındıran generic list ile çalışacağız.ID ve Name propertylerini içeren Person sınıfını projemize ekleyelim.Daha sonra ana fonksiyonda listeye ekleme yapalım.

static void Main(string[] args)

{

     List<Person> people = new List<Person>        

   {          

        new Person{ID=1,Name="Betül"},

        new Person{ID=3,Name="Ayşe"}, 

        new Person{ID=5,Name="Ahmet"},   

        new Person{ID=2,Name="Selim"}, 

        new Person{ID=4,Name="Kübra"}  

      };  

          GetLastN(people,3);

 }

Şimdi son n tane kaydı getiren linq sorgumuzu  sonucu ekrana yazdıran bir metod içinde yapalım.Metodumuz parametre olarak listeyi ve en son getirelecek kayıt sayısını alır.

public static void GetLastN(List<Person> people,int n)   

  {

             IEnumerable<Person> lastN = (from p in people    

                                                          select p).OrderByDescending(c => c.ID).Take(n); 

             foreach (Person person in lastN)         

             {

                  Console.WriteLine(person.Name);           

              }

 }

Metodumuzun işleme mantığı kendisine parametre olarak gelen listedeki kayıtları önce azalarak sıralar ve sonra Take(int n) fonksiyonu ile ilk n kaydı alır.Daha sonra kontrol amaçlı olarak foreach ile aldığımız ilk  n kaydı ekrana basıyoruz

Teşekkürler.

Tags: ,

C# | LINQ

LINQ-Dinamik Sıralama

Ağustos 15
by Abdurrahman Köken 15. Ağustos 2009 01:56

LINQ sorgularında dinamik sıralama  ile kullanıcının isteğine göre ayrı ayrı linq sorguları yazmaktansa tek bir sorguda bunu nasıl yapabiliriz ona değinmek istiyorum.Dilerseniz örnek uygulama üzerinden devam edelim.Örneğimizi Console uygulamasında gerçekleştireceğim.İlk olarak Person adında bir sınıf oluşturarak ID ve Name olmak üzere iki tane property tanımlaması yapalım.Daha sonra main fonksiyonu içine şu kodları yazalım.

static void Main(string[] args)

{

       List<Person> people = new List<Person>

      {

             new Person{ID=1,Name="Betül"}, 

             new Person{ID=3,Name="Ayşe"}, 

             new Person{ID=5,Name="Ahmet"},

             new Person{ID=2,Name="Selim"},    

             new Person{ID=4,Name="Kübra"} 

        };

            Sort(people,p=>p.ID);

    }

Listemize birkaç tane kişi ekledikten sonra sıralama listemizde sıralama yapan linq sorgusunu yazalım.

public static void Sort<TKey>(List<Person>people,Func<Person,TKey>selector)  

{

            var sortedCollection = from p in people 

                                            orderby selector(p) 

                                            select p; 

           sortedCollection.ToList<Person>().ForEach(p => Console.WriteLine(p.Name));        

}

Bu metodla listemizde istersek ID ye göre istersek de Name ‘e göre sıralama yaptırabiliriz.Hemde tek bir sorguda:)Örneğimizde ana fonksiyondan Sort fonksiyonunu ID ye göre çağırıyoruz ve ekranda bize ID’ye göre sıralanmış olan listedeki elemanların isimlerini ekranda göstermiş olduk.

Teşekkürler.

Tags: ,

C# | LINQ

Abdurrahman Köken-Recent Post