Linq sorgulamaları örnek bir veritabanı üzerine anlatmaya çalısacağım. Bir onceki yazıda projeye Entity Model nasıl eklenir anlatmaya çalısmıstık. Projemize Demo bir veritabanı yukleyerek onun üzerinden sorgulamaları yapmaya baslayalım.
Projemize eklenene EntityModel:takipModel.edmx
Context nesnemiz: takipEntities1
Örnek bir Müsteri takip veritabanı:
SORGULAMALAR
1- Select:
Veritabanından istenilen bilgiyi getirmek için kullanılır.
* Tüm müşeterilerin Listesini getiren sorgu;
takipEntities1 context = new takipEntities1();
var musteri = (from s in context.tbl_musteri select s).ToList();
Burada musteri değişkeni tblmüsteri modelinde bilgileri liste şeklinde tutar. Bu değişkeni datagride veriğimizde musteri_id, musteri_ad_soyad, musteri_yas,musteri_meslek sutunlarından olusan bilgiler datagridde listelenir. Peki belli bir kosul verirsek nasıl olur. Örneğin ismi Seda Yılmaz olan kişinin bilgilerini getir dediğimizde;
var musteri = (from s in context.tbl_musteri where s.musteri_ad=='Seda Yılmaz' select s).FirstOrDefault();
FirstOrDefault: veritabanında bulunan ilk kaydı getir eger kayıt yoksa null değeri döndür demektir. Sdaece First() dersek eğer kaydı bulamassa program hataya düşer. Eger istediğimiz bilgi tek satırlık yada tek bir bilgi ise FirstOrDefault() , eğer birden fazla satır yada bilgi tekrarını liste olarak geri döndüreceksek ToList yada Array dememiz gerekir. Diyelimki fonksiyon seklinde sorgu yazıyoruz ve fonsiyon geri değer olarak List<tbl_musteri> türünde bir liste döndürüyor. eğer sorgunun sonuna ToList dersek sorgunun hemen altına return musteri diyebilriz. ToList demessek foreach ile musteri değişkeninin içinde dönerek List<tbl_musteri> türünde bir değişken olusturmamız gerekebilir.Bu yöntemlede çalısır ama kısa yol varken ne gerek ver uzun yola :)
*Eğer tablodan sadece bir sutunu örneğin ismi 'Seda Yılmaz' olan kişinin mesleğini öğrenmek istiyorum Bu durumda;
var musteri = (from s in context.tbl_musteri where s.musteri_ad=='Seda Yılmaz' select
s.musteri_meslek).FirstOrDefault();
*Yası 18 olan musterilerin isimlerini listelet:
var musteri = (from s in context.tbl_musteri where s.musteri_yas==18 select
s.musteri_ad_soyad).ToList();
*Yası 18 olan müsteri bilgilerinden musteri_id sini ve mesleğini istiyorum. diğer bilgiler gereksiz yere gelmesin dersek;
var musteri = (from s in context.tbl_musteri where s.musteri_yas==18 select new{s.musteri_id,
s.musteri_meslek}).ToList();
Sql deki Select sorgusunu Entity Framework üzerinden linq sorgusu olarak yazımını elimden geldiğince çeşitlendirerek anlatmaya çalıstım.
2- Delete & Update
Sql sorgulamalrınde veritabanına veri silerken veya güncellerken ayrı sorgu yazım şekilleri vardır. Linq nun kullanımının kolaylığı en cok burada belirgin sanırım. Linq nesne üzerinden sorgulama yapıyor demiştik. Nasıl ki c# ta bir değişkenin içeriğini değiştirirken =yenideğer yapıyorsak bu sorgulamalardada pek bi değişiklik yok aslında.
delete: musteri_id si 5 olan musterinin rezervasyonunu iptal edelim. Öncelikle musteri_id si 5 olan kişinin rezervasyon bilgilerini getimeliyim.
takipEntities1 context = new takipEntities1();
var rez = (from s in context.tbl_rezervasyon where s.musteri_id==5 select s).FirstOrDefault();
context.DeleteObject(rez);
context.SaveChanged;
DeleteObject veritabından verilen bilgiyi siler. burada dikkat edilmesi gereken veritabanından bir satırı silerken (burada rez) tüm satırı getirmeliyiz. select s.rezsaat dersek hata verir. eger biz sadece bir alanı silmek istiyorsak bunu update işlemiyle o alana null değer atayarak yapabilriz.
update: Yukarıdaki aynı örnek için musteri_id si 5 olan kişinin rezervasyon saat' ini ve tarihini güncelleyelim.
takipEntities1 context = new takipEntities1();
var rez = (from s in context.tbl_rezervasyon where s.musteri_id==5 select s).FirstOrDefault();
rez.rez_tarih='14.12.2012';
rez.rez_saat='14:30';
context.SaveChanged;
Update işlemi bu kadar veritabanımızdan guncellemek istediğimiz satırı getirdik ve değişken değerini değiştirir gibi değerlere yeni değerleri ekledik ve değişiklikleri kaydettik
3-Insert:
Veri tabanına yeni bir değer eklemek istediğimizde bu sorgu modelini kullanırız. Örneğin 5 nolu musterimize yeni rezervasyon kaydı yapmak istiyoruz:
takipEntities1 context = new takipEntities1();
tbl_rezervasyon yeni_rezervasyon = new tbl_rezervasyon();
yeni_rezrvasyon.musteri_id=5;
yeni_rezervasyon.rez_tarih='14.12.2012';
yeni_rezervasyon.rez_saat='15:00';
context.AddTotbl_rezervasyon(yeni_rezervasyon);
context.SaveChanged;
Ekleme işleminde ekleme yapılacak olan tablo modelinde yeni bir nesne olusturup bu nesneye yeni değerleri attık. yeni nesnemizi veritabanına kaydı için AddTotbl_rezervasyon 'u kullandık. daha sonra değişklikleri kaydettik.
Yeni bir musteri kaydında yine aynı şekilde;
takipEntities1 context = new takipEntities1();
tbl_musteri yeni_musteri = new tbl_musteri();
yeni_musteri.musteri_id=1212;
yeni_musteri.musteri_ad_soyad='Seda Yılmaz';
yeni_musteri.yas=24;
yeni_musteri.meslek='Bilgisyar Mühendisi';
context.AddTotbl_rezervasyon(yeni_rezervasyon);
context.SaveChanged;
4. InSelect(İç içe sorgu)
A ve B şeklinde ikiye ayrmamın nedeni sorgulama yöntemine göre tablolar arası dolaşma yöntemininde değişmesi bu yontem sekli sql server sorgulamalar içinde geçerlidir. bu yontemde birden fazla tabloda where şartı verbilirisiniz fakat gösterilecek olan alan sadece bir tane tabloya ait olmalıdır. aşağıdaki örnekte musteri tablosundan sartı sorguladık ve sadece rezervasyon bilgilerini istedik. Eğer musterinin mesleği ve yası bilgisini de istedeydik B yöntemine girerdi. Nedeni hem musteri tablosundan select ile veri alımı hemde rezervasyon tablosundan select ile veri alımı yapılmasıdır.
A: Bir tablodan gösterim diğer tablolardan şartların sorgulanması:
Bazen birbiri ile bağlantılı tablolardan veri çekmek isteriz örneğin musteri ismi Seda Yılmaz olan kişinin rezervasyon bilgilerini almak istersek iki tabloyla karsı karsıyayız demektir. Bu durumu iki şekilde çözebiriz. iki ayrı sorgu yazarsını ilkinde musteri tablosunda ismi Seda Yılmaz olan musterinin musteri id sini bir değişkene atarsınız. ikinci sorguda tbl_seans tablosunda musteri id si şu olan kişinin rezervasyon bilgisini getir diyebiliriz ama bu karmasıklık açısından maliyetlidir. Bunun yerine tek sorguda tablolar arasında dolaşarak istediğimiz bilgileri elde edebilir. Üzerinde konustuğumuz örneğin iki şekliylede yazalım:
1. yöntem:
takipEntities1 context = new takipEntities1();
var musteri = (from s in context.tbl_musteri where s.musteri_ad_soyad=='Seda Yılmaz' select
s.musteri_id).FirstOrDefault();
var rezervasyon_bilgiler= (from s in context.tbl_rezervasyon where s.musteri_id==musteri select
s).ToList();
2. yöntem:
takipEntities1 context = new takipEntities1();
var rez = (from mus in context.tbl_musteri where musteri_ad_soyad='Seda Yılmaz'
join rz in context.tbl_rezervasyon on mus.musteri_id equals rz.musteri_id
select rz).ToList();
ToList() dememizin nedeni bir müsterinin birden fazla rezervasyonu olabilirliği için. tabloda bu nedenle bire-çok ilişki kullanılmıstır. musteri id musteri tablosunun birinci anahtarıdır ve rezrvasyon tablosuna bağlanmıstır. birincilden ikincile doğru yol izlenmelidir. on yazımının öncesinde ikincil olan tablo yer almalı ve equals ile birincil anahtarı olan tabloya bağlanmalıdır. daha sonrası where şartlandırmadır.Şartlarımızı bulunduğumuz tablonun Where kısmına yazmalıyız. Musteri tablosundayken musteri ad soyadını sorguladık eğer rezervasyon tarıhı şu olan deseydi select satırının bir ustune rz.musteri_id den sonra where yazarak rezervasyon tarihini sorgulatmamız gerekirdi. Eğer bir üçüncü tabloya daha gitmek isteseydik Where şartını belirttikten sonra tekrardan join ile rezervasyon tablosundan rez_id nin bağlı olduğu baska bir tabloya bağlanıp sorgulamalara devem edebilrdik. Örnek veritabanımızda rez_id nin bağlı olduğu birtablo olmadığı için bi parantez açıp bu bilgiyi vermek istedim.
B: Birden fazla tablodan gösterim,Birden fazla tabloda where kosulu:
Bu alan içinde yukarıdaki örneğin benzerini çözelim. Musteri adı 'Seda Yılmaz' olan kişinin meslek, yası ve 14.12.2012 tarihindeki rezervasyon saatini ögrenelim.
takipEntities1 context = new takipEntities1();
var rez = (from mus in context.tbl_musteri
from rz in context.tbl_rezervasyon
where rz.musteri_id == mus.musteri_id && mus.musteri_ad_soyad=="Seda Yılmaz" &&
rz.res_tarih=="14.12.2012"
select new{ rz.rez_saat,mus.musteri_meslek,mus.musteri_yas}).FirstOrDefault();rz.res_tarih=="14.12.2012"
Burada join sistemini kullanmadık. Eğer tablolarımızda hem sorgu hem gösterim yapılacaksa yukarıdakı gıbı birincil anahtarları eşitleyerek tek bir where altında tüm şartları sorgulatabilriz. gosterilcek alanlar çeşitlendiği için new ile yeni bir liste olusturarak getirmemiz gerekir
5.Gruplandırma
Örneğin firmamızda yas gruplarına göre kaç kişinin geldiği yada hangi yas grupları firmamızı tercih ediyor sorgusu için gruplandırma yöntemi kullanılır.
takipEntities1 context = new takipEntities1();
var s = from o in context.tbl_musteri
group o by new { o.musteri_yas}
into g
select new
{
Tur = g.Key.musteri_yas,
Adet = g.Count()
};
Bu sorguda eğer bir şart (Where) belirtilecekse bunu group yazısından hemen önce belitmesi gerekir.
Hiç yorum yok:
Yorum Gönder