Sql Server’da durum nasıl bilmiyorum ama geçenlerde Oracle’da şöyle bir durum farkettim: Where kısmında kullandığımız NOT IN komutu, IN komutunun birebir tersi şeklinde bir sonuç getirmeyebiliyor. Şart kısmında belirttiğimiz değerler içinde NULL olan kayıt varsa işler oldukça değişebiliyor. Küçük bir örnekle açıklamak gerekirse:
Etiket: ‘linq to sql’
Linq Sorgusunu Datatable’a Çevirme
Yeni teknolojilerden mahrum kalmamak adına üzerinde çalıştığım bir projede Linq To Sql kullandım ve bayağı bir faydasını da gördüm. Veritabanına ulaşmak, oradan veri çekmek, veri ekleme, silme, güncelleme gibi işlemler inanılmaz kolaylaştı.
Fakat her ilacın yan etkisi olduğu gibi Linq To Sql’in de bize yaşattığı aksaklıklar oldu tabi. Bu aksaklıklar projenin bayağı aksamasına da sebep oldu. Tabi aksaklıkların Linq’dan değil de benim acemiliğimden ya da yeniliklere adapte olamadığımdan kaynaklandığını da düşünebiliriz. Fakat şimdi değineceğim konuyu biraz irdelerseniz bu sorunların aslında bir çok kişi tarafından yaşandığını görürsünüz.
Projede datalist içinde sayfalama sistemi yapmam gerekiyordu. Bunun için de PagedDataSource(bkz. yazgeliştir) nesnesini kullanacaktım. Fakat bir sorun vardı. Yazdığım Linq sorgusunu PagedDataSource’a bağlayamıyordum. Önce normal DataTable’a, oradan da PagedDataSource’a bağlayayım dedim ama nafile. Sürekli hata mesajlarıyla karşılaşıyordum. Bu konuyu araştırmak üzere Google amcaya başvurduğumda sorunu çözmek uzun sürmedi ama bir şeyi farkettim ki, bu konuda(Linq sorgusunu Datatable’a dönüştürme) hali hazırda bir metod, sınıf vs. yok. Sorunun çözümü için herkes kendine göre bir metod yazıp işini görmüş. Ben de kendi metodumu yazmak yerine hazıra onmayı tercih ettim ve buradan metodu kopi peyst yapıp vb diline çevirerek kullandım
.
Metodun c# versiyonunu buradan alabilir veya benim hazırladığım vb versiyonuna da aşağıdan bakabilirsiniz:
Public Function ToDataTable(ByVal ctx As System.Data.Linq.DataContext, ByVal query As Object) As DataTable Dim cmd As IDbCommand = ctx.GetCommand(query) Dim adapter As New SqlDataAdapter adapter.SelectCommand = CType(cmd, SqlCommand) Dim dt As New DataTable("sd") Try cmd.Connection.Open() adapter.FillSchema(dt, SchemaType.Source) adapter.Fill(dt) Finally cmd.Connection.Close() End Try Return dt End Function |
Kullanım Şekli:
Dim tmpTags As New UI_Class.UIData Dim query = From t In tmpTags.LU_TAGs _ Where t.VALID = 1 _ Group t By t.DS_TAG Into Count() _ Select DS_TAG, TAG_COUNT = Count Dim dtTemp As New PagedDataSource dtTemp.DataSource = ToDataTable(tmpTags, query).DefaultView |
Bu yazının da sonuna böylece gelmiş olduk. İnşallah faydası olur temennisiyle; görüşmek üzere.
Linq To Sql Ve N Katmanlı Mimarimiz
Aslında okumakta olduğunuz yazının başlığını önce “Linq to Sql Dünyasına Merhaba” diye yazmıştım. Fakat .Net ile uğraşıp da bu konuda yazı yazmayan kalmadı nerdeyse. Bu durumda benim de aynı şeyleri yazmam pek birşey ifade etmeyecekti. Başka bir konuya değinmek gerekiyordu o zaman. Siz okurlara verilen söz gereği dersimiz Linq olmalı fakat konu değişmeliydi.(Önceki yazımda anlatacağımın sözünü verdiğim diğer konular: Asp.Net Mvc, jquery ve Datagrid). Bu düşüncelerden sonra daha önce merak ettiğim için biraz baktığım, hatta bir projemde kullanmaya çalıştığım, türkçe sitelerde pek değinilmemiş olan bu konu hakkında birşeylerden bahsetmeyi uygun gördüm. Haydi Bismillah
Bu arada konumuza geçmeden önce n katmanlı mimari konusuna yabancı olanları öncelikle buradaki yazımı okumasını tavsiye ederim.
Linq to sql çıkmadan önce klasik olarak projelerimde, diğer yazılımcıların ekserisi gibi ben de 3 katmanlı mimariyi uygulamaya çalışırdım ve bu konuda iyi – kötü bir standardı tutturmuş gidiyordum. Ta ki Linq to sql çıktı ve ben bu yeni teknolojiyi öğrenmeye karar verdim, işte o zaman “Benim 3 katmanlı mimarim nasıl olması gerekiyor şimdi?” sorusunu sormaya mecbur kaldım. Biliyorsunuz Linq to sql sayesinde veritabanı ile ilgili temel işler tek komutla halledilecek hale geldi ve en önemlisi veritabanından veri çekmek için yazdığımız sql sorgularını kod tarafında yazmaya başladık. (Cümle “biliyorsunuz” kelimesi ile başladı; eğer bilmiyorsanız buradaki yazı tam size göre). Buna mukabil katmanlarımızda değişiklik olması su götürmez bir gerçek.
Bu gerçeğin farkına varınca tabi hemen araştırmaya başladım. Türkçe sitelerde bu konuya pek değinilmemiş ama ingilizce sitelerin bu konuda maşallahı var. Ben buradaki yazıyı güzelce okuyup, fazla zamanım olmadığı için direk olarak üzerinde çalıştığım bir projede kullandım. Projede ilerledikçe bazı eksikliklerini seziyorum ama yine de şimdilik iyi gibi. Hemen size her katmandan bir örnek verip konuya son vermek istiyorum.
Örneğimiz soru yazıp kaydedeceğimiz bir uygulama üzerine ve data katmanımız kaydedilen soruları içinde barındıran Question isimli tabloyu temsil ediyor.
Data Katmanı:
Public Class cls_LU_QUESTION Private objUIData As New UIData Public Function GetAll() As IQueryable(Of LU_QUESTION) Try Return objUIData.LU_QUESTIONs Catch ex As Exception Throw ex End Try End Function Public Function GetByIdQuestion(ByVal pIdQuestion As Long) As LU_QUESTION Try Return (From question In objUIData.LU_QUESTIONs _ Where question.ID_QUESTION = pIdQuestion _ Select question) Catch ex As Exception Throw ex End Try End Function Public Function Add(ByVal objQuestion As LU_QUESTION) As Long Try objUIData.LU_QUESTIONs.InsertOnSubmit(objQuestion) objUIData.SubmitChanges() Return objQuestion.ID_QUESTION Catch ex As Exception Throw ex End Try End Function Public Function Update(ByVal objQuestion As LU_QUESTION) As Boolean Try Dim tmpQuestion = objUIData.LU_QUESTIONs.SingleOrDefault(Function(x) x.ID_QUESTION = objQuestion.ID_QUESTION) objUIData.SubmitChanges() Return True Catch ex As Exception Throw ex End Try End Function Public Function Delete(ByVal pIdQuestion As Long) As Boolean Try objUIData.LU_QUESTIONs.DeleteOnSubmit((From Question In objUIData.LU_QUESTIONs _ Where Question.ID_QUESTION = pIdQuestion).Single) objUIData.SubmitChanges() Return True Catch ex As Exception Throw ex End Try End Function End Class |
İş Katmanı:
Public Class cls_LU_QUESTION Private objLU_QUESTION As New DAL.cls_LU_QUESTION Public Function GetAll() As IQueryable(Of LU_QUESTION) Try Return objLU_QUESTION.GetAll Catch ex As Exception Throw ex End Try End Function Public Function Add(ByVal objUser As LU_QUESTION) As Long Try Return objLU_QUESTION.Add(objUser) Catch ex As Exception Throw ex End Try End Function Public Function Update(ByVal objUser As LU_QUESTION) As Boolean Try Return objLU_QUESTION.Update(objUser) Catch ex As Exception Throw ex End Try End Function Public Function SaveQuestion(ByVal pQuestion As LU_QUESTION, ByVal pLstTags As String()) As Long Using pScope As New TransactionScope(TransactionScopeOption.Required, System.TimeSpan.MaxValue) 'Dim lngIdQuestion As Long = IIf(pQuestion.ID_QUESTION > 0, dalQuestion.Update(pQuestion), dalQuestion.Add(pQuestion)) Try Dim dalQuestion As New DAL.cls_LU_QUESTION Dim lngIdQuestion As Long = dalQuestion.Add(pQuestion) For Each lstTag In pLstTags Dim dalTagQuestion As New DAL.cls_CR_TAG_QUESTION Dim objTag As New LU_TAG Dim objTagQuestion As New CR_TAG_QUESTION Dim tmpTags As New UIData Dim strTag = lstTag Dim tmpTag = tmpTags.LU_TAGs.SingleOrDefault(Function(x) x.DS_TAG = strTag) If tmpTag Is Nothing Then objTag.DS_TAG = strTag objTag.VALID = 1 objTagQuestion.LU_TAG = objTag Else objTagQuestion.ID_TAG = tmpTag.ID_TAG End If objTagQuestion.ID_QUESTION = lngIdQuestion dalTagQuestion.Add(objTagQuestion) Next pScope.Complete() Catch ex As Exception Throw ex End Try End Using End Function End Class |
Sunum Katmanı:
Private Sub btnSave_ServerClick(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnSave.ServerClick SaveForm() End Sub Private Sub SaveForm() Dim objQuestion As New LU_QUESTION Dim balQuestion As New BAL.cls_LU_QUESTION Dim lstTag As String() = Me.txtTags.Value.Split() Dim tmpTicket = CType(User.Identity, FormsIdentity).Ticket With objQuestion .DS_SUBJECT = Me.txtTitle.Value .DS_QUESTION = Me.txtBody.Value .DT_INSERT_TIME = DateTime.Now .ID_QUESTION_TYPE = 1 .ID_USER = tmpTicket.UserData .VALID = 1 End With balQuestion.SaveQuestion(objQuestion, lstTag) End Sub |
Faydası olacağını umduğum bir yazı ile karşınızda oldum. Görüşmek üzere
Yazılım Aylığı Mı Olsak Ne?
Bu bloga yazdığım son yazının tarihine bakıyorum da 6 Kasım yazıyor. Bu gün ise 6 Aralık. Demek oluyor ki tam bir aydır yazmıyorum. Bu blogu açtığım sıralar yazmaya çok hevesliydim ki adını yazılım güncesi(günlüğü) koymuşum. Ama artık heves yok olmuş ki tam 1 aydır yazmıyorum. Çok işlerim vardı, o yüzden yazamadım gibi bahaneler de öne sürülebilir fakat hiçbir bahanenin 1 ay geçerliliği yoktur sanırım.
O yüzden bu bloga yazılım aylığı deseydik daha mı iyi olurdu acaba diye düşünmüyor da değilim hani… Aylık dergiler gibi topluca yazar, sonra bir ay boyunca yüzüne bile bakmazdım sitenin.
(daha fazla…)


