pillinetwork hesabınızla giriş yapın.

Linq to SQL - İçiçe (Nested) Repeater - Datalist Kullanımı

Öncelikle bu yazının bir .NET 3.0+ makalesi olduğunu söylemek isterim.

Bence "linq icat oldu mertlik bozuldu(LİOMB)", Makale 1.

İzin verirseniz linq ile ilgili tüm makalalerimin başına bu başlığı, "LİOMB", koymayı istiyorum. Peki neden linq icat oldu mertlik bozuldu. Çünkü, artık veritabanı işlemleri gerçekten çocuk oyuncağına dönüştü. O kadar basit bir şekilde veritabanından verileri alıyorsunuz ve işliyorsunuz ki eski yöntemlerle uğraşmak artık zor geliyor. Tabi ki bazı arkadaşlar hız ne olacak diye söylenmeye başlayabilirler. Kimin umrunda :), en azından bu konu bu makalenin konusu değil. Hem günlük 300-500 kullanıcının ziyaret ettiği bir kaç sitede kullandım ve gerçekten bir sorun yaşamadım.

İsterseniz eskiden veritabanından nasıl veri çektiğimize bir göz atalım ne dersiniz.

Bir connection string yaratılır.
Connection nesnesi yaratılır ve yaratılırken connection string kullanılır.
Connection nesnesi ile bir command nesnesi yaratılır.
Bir data adapter yaratılır ve bu data adapterda command nesnesi kullanılarak veriler çekilip bir DataTable doldurulur.

İşte böyle bir zorlu yoldan geçerek veritabanından verilerimizi alırdık eskiden.

Şimdi ne yapıyoruz bakalım.

Bir DBML dosyası yaratıp içerisine veritabanımızı modelliyoruz.
Sonrasında DBML dosyasında belirtilen DataContext nesnemizden bir örnek yaratıyoruz.
Sadece tek satır kod ile istediğimiz veri kümesini veritabanından çekiyoruz.

İsterseniz bir de kodlarla bu işlemleri görelim. İlk olarak eski yöntem

1
2
3
4
5
SqlConnection con = new SqlConnection(ConfigurationSettings.AppSettings["ConStr"]);
SqlCommand cmd = new SqlCommand("sql cümlesi", con);
DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(dt);

Şimdi de yeni yöntemi görelim yani Linq to SQL

1
2
3
OrnekDataContext db = new OrnekDataContext();
var result = (from p in db.Ilans
select p);

Evet işte bu kadar basit bir şekilde tüm ilanlarımızı veritabanından çekmiş bulunuyoruz. Ne kadar basit değil mi?

Gel gelelim iç içe repeater, datalist vb veri göstericilerinin kullanımına.
Diyelim bir datalistiniz var ve içerisinde de bir repeater ile içiçe gösterim yapmak istiyorsunuz. Örneğin, Ana Kategori altındaki alt kategorileri göstereceksiniz.

1
2
3
4
5
6
7
8
9
10
11
<asp:DataList ID="dlAnaKategori" runat="server">
<ItemTemplate>
<%#Eval("KategoriAdi") %>
<asp:Repeater ID="rptAlt" runat="server" DataSource='<%#Eval("AltKategoriler") %>'>
<ItemTemplate>
<%#Eval("KategoriAdi")%>
</ItemTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
</asp:DataList>

Evet tabiki veritabanında kategoriler ve alt kategoriler tabloları ilişkili olmak zorunda. Veritabanı işlemleri sizin uzmanlığınıza kalmış. Ama içiçe repeater ya da diğer veri göstericilerini kullanan arkadaşlar eski sistemin ne kadar zor olduğunu bilirler eski sistemde. Yukarıda gösterdiğimiz ilk kod ile iki adet data table elde etmeniz gerekir ve sonrasında aşağıdaki kod ile bu iki datatable örneğini birbirine bağlamanız gerekir.

1
2
3
4
5
6
7
8
DataTable dtAna = SanatEserim.Data.KategoriIslemleri.AnaKategoriler();
DataTable dtAlt = SanatEserim.Data.KategoriIslemleri.AltKategoriler();
DataSet ds = new DataSet();
ds.Tables.Add(dtAna);
ds.Tables.Add(dtAlt);
ds.Relations.Add("relation", ds.Tables[0].Columns["KategoriKodu"], ds.Tables[1].Columns["UstKategori"]);
dlAna.DataSource = ds.Tables[0];
dlAna.DataBind();

Bu da onun asp kodu. Karşılaştırma bölümünü siz yapın ve kolaylığı görün.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<asp:DataList ID="dlAna" runat="server">
<ItemTemplate>
<div style="width: 200px; vertical-align:top;">
<%#Eval("KategoriAdi") %>
<asp:Repeater ID="rptAlt" runat="server" DataSource='<%# ((DataRowView)Container.DataItem)
.Row.GetChildRows("relation") %>'>
<ItemTemplate>
<%# DataBinder.Eval(Container.DataItem, "[\"KategoriAdi\"]")%>
</ItemTemplate>
</asp:Repeater>
</div>
</ItemTemplate>
</asp:DataList>

Linq ile zaten DBML dosyasında ilişkileri ile veritabanınızın bir modeli var. Bu model sayesinde sizin ayrı ayrı tabloları elde edip ilişki vermenize gerek kalmıyor. Sadece ilk tabloyu veritabanından alıyorsunuz ve detay tablo DBML'deki ilişki sayesinde ulaşılabilir oluyor. İşte bu kadar basit.

Linq icat oldu mertlik bozuldu(LİOMB). Bir sonraki makalede buluşmak üzere.

Spacer
Spacer
/* halislus yazdı. 10 Haziran 2009 13:16. 10 yorum var */

Yorumlar

Benim bildiğim veritabanı deyince akla ilk önce performans geliyor. Neyse umarım bunu bir sonraki makalede açıklığa kovuşturursunuz.

ORM denilen olay 5-10 seneden beri vardı zaten. Özellikle Django ORM ve SQLObject e bir göz atmanızı tavsiye ederim.. Hani adı LINQ olmuş , ahmet mehmet olmuş çok önemli değil. Konsept yeni değil..

Microsoft yine yapılmış birşeyin adını değiştirip yeni birşey gibi sunmuş.. Neyse olacak o kadar artık..

maşallah...

/* Hiçbirşey benden kıymetli değil ;) */

Ben birşeyin yapılmış olmasına bakmam ne kadar yaygınlaşmış olduğuna bakarım. ORM'yi daha önce kullandıysanız o zaman diyecek bişey yok. Ama ORM kullanmamış da sadece Microsoft'a çamur at izi kalsın mantığındaysanız. Harbiden ahkam kesmişsiniz.

5 senedir veritabanı programcılığı ve ASP.NET üzerine iş yapıyorum.Almanya ve Amerika dahil linq to sql haricinde ORM kullanan bir firma görmedim.

/* Halislus */

amacım ahkam kesmek veya microsoft'a çamur atmak değil. doğru bildiğim şeyi yazıyorum .. size bilgi vermek amacım.. yani microsoft dışındada bu yıllardır yapılıyor diyorum.. asp.net üzerinde iş yapıyorum diyorsunuz. size verdiğim örnekler python zaten.. açıp bakmamışsınız.. kendinizi geliştirme ve ufkunuzu açma olanağı sunuyorum size.. bu var ama bakın buda var diyorum..
bu arada sizin ORM kullanan görmemeniz bunun kullanılmadığı anlamına mı geliyor? Önermenizden bu anlaşılıyor.. en iyi şey benim bildiğimdir mantığından uzaklaşın.. benim yanlışım eksiğim varsa uyarın.. ama lütfen körü körüne birşeyin fanı olmayın.. umarım ifade edebilmişimdir.

Anlatım için Teşekkürler

LINQ to Sql tam olarak bir ORM sistemi değildir. Microsoft'un tam manasıyla çıkardığı ORM ürünü Entity Framework'tür.

.Net için kullanılabilecek ücretli/ücretsiz/açık kaynak bir çok ORM frameworkü var, mesela NHibernate. Şunu da söyleyebilirim ki Microsoft Entity Framework'ü çıkardıktan sonra LinqToSql'i öldürmüştür. Kendileri, artık Entity Framework kullanılmasını tavsiye ediyorlar. Ben kendi tecrübelerimden -özellikle büyük projelerde- LinqToSql kullanımı pek görmedim. Daha çok ORM yapıları tercih ediliyor

Ama Linq için(to Sql değil) çakma demek oldukça yanlış. Şu anda hiçbir yapıda bu tip bir syntax bulunmuyor. Ayrıca oldukça kullanışlı. Microsoft bu durumda zaten yapılmış bişeyi yeni diye önümüze sürmüyor.

/* kaan.basesistem.com */

bkz :
http://phplinq.codeplex.com/

anlamadım OrnekDataContext nerde tanımlanıyor. sql yolumuzu vs nasıl atıyoruz buna. arkadaşlar mümkünse döküman yazarken çalışır uyglama yada kodları da zip şeklinde atalım. atlanan yerler oluyor özellikli linq yeni bir konu.

biraz daha açıklayıcı bi makele olsaydı daha çok sevinecektim.

kusura bakma yorumu biraz geç gördüm. OrnekDataContext dbml dosyası içerisinde tanımlanıyor. Add new ite diyorsun oradan Linq To SQL Class dosya türünü seçiyorsun. Adına Ornek dersen eğer dbml dosyası oluşturulduğunda OrnekDataContext oluşturuluyor.

/* Halislus */

cok guzel bir tartısma olmus, yureklerinize saglık. epey sey ogrendim bu tartısmadan. gorusmek uzere yine.

üye olunpillinetwork sitelerine yorum ekleyebilmek ve daha fazlası için, üye olun ya da giriş yapın.

İlgili Yazılar

Bu Yazıyı Tutanlar

Bu yazıyı rapor et. Kural dışı içeriğe rastladığınızda editörlerimize rapor ederek müdahale edilmesini sağlayabilirsiniz. (Hangi durumlarda rapor edebilirim?)

Bu site

Nokta ve pilli ortak yapımı olan kodaman.org hep birlikte içerik üretip gelirini yazarları ile paylaştığımız kolektif bir kod yazarları blogudur. Siz de katılabilirsiniz.

pilliilan

son yorumlar

arama

pillinetwork