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:
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
Etiketler: 3 katmanlı mimari, 3 tier architecture, ASP.NET, featured, Linq, linq to sql
- Linq Sorgusunu Datatable’a Çevirme
- Yazılım Aylığı Mı Olsak Ne?
- FileUpload İle Aynı İsimde Birden Fazla Dosya Kaydetme



Aralık 20th, 2008 - 16:14
verdiğin bilgiler için teşekkür ederim serdar (:
Ocak 23rd, 2009 - 15:04
Evet biliyordum… Efsanenin geri döneceğini biliyordum….
Ocak 30th, 2009 - 16:17
Makaleye tam ısınıyordum, kodlar copy paste yapılıp makale bitirilmiş.
Bir de efsane diye yorum var.
Gerçekten katıla katıla güldüm burada efsaneye
Ocak 31st, 2009 - 12:15
@Erhan Yılmaz;
Makale konusundaki yorumunda haklısın galiba. Makaleye şevkle başlamıştım aslında ama sonuna doğru makalenin de iyice uzamasıyla kısa kesme gereği duydum. Belki bu vesileyle kodlarda anlaşılmayan kısımlar yorum kısmında tartışılır ve belki daha efektif bir ortam oluşmuş olur. Ne dersiniz hoş olmaz mı