LINQ Sorgusu içinde IF kullanmak ya da IF kullanmaya gerek yok mu?

Merhaba,

LINQ ile çalışırken zaman zaman karmaşık sorgular oluşturmamız gerekebiliyor ve doğrudan halledemeyeceğimiz durumlar oluşabiliyor.
Bugün bu durumlardan biri başıma geldi basit bir örnekle anlatmaya çalışacağım.

Source adında bir tablomuz olduğunu varsayalım. Bu tablo içinde OID,Name,startdate,enddate ve SourceType adında 2 alanımız olsun.
Bir Dropdown koyalım ve içine bütün source Typelarını koyalım. ( 3 tanse SourceType olduğunu varsayalım). bir de name'i yazabileceğimiz textboxumuz olsun(txtSearchString).
Bir gridview içinde Tipi dropdownda seçilmiş Tipe uyan bütün sourceları göstermeye çalışalım.
Bunu yapmak için aşağıdakine benzer bir sorgu hazırlamamız gerekir.

var sourceData = from s in dc.Sources
where s.SourceTypeID == int.Parse(ddlSourceType.SelectedValue)
&& s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};

Peki Dropdown'a 1 kayıt daha ekleyelim ismi "Hepsi" olsun ve değerini "0" yapalım.
Şimdi dropdownda "Hepsi" seçildiğinde Hiç sourceType alanına bakmadan sadece source ismi txtSearchString'e yazılan değerle uyuşan kayıtları getirmeye çalışalım.

Ne yapmamız lazım? evet evet buldum!! Hemen sorgunun başına bir IF koyalım ve sourceData sorgusundan bir tane daha yaratalım ama bu sefer içine sourceType alanına baktırmayalım else durumuna da yazarız yine SourceType alanına bakandan:

var sourceData="";

IF (ddlSourceType.SelectedValue == "0")
{

sourceData = from s in dc.Sources
where s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};
}
else
{
sourceData = from s in dc.Sources
where s.SourceTypeID == int.Parse(ddlSourceType.SelectedValue)
&& s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};

}

Evet evet istediğimiz yaptık. Ne olacak kopyalarız yapıştırırız her seferinde, taş attık da kolumuz mu yoruldu dimi?
HAYIR yorulmadı ama bu kadar uğraşmadan da bunu yapabilirdik.

Amacımız ne? Eğer dropdown'un değeri "0" ise SourceTypeID'ye bakmadan ne varsa getirmek.
şöyle bir sorguyla bunu halledebiliriz:

var
sourceData = from s in dc.Sources
where
(s.SourceTypeID == int.Parse(ddlSourceType.SelectedValue) || ddlSourceType.SelectedValue=="0")
&& s.Name.Contains(txtSearchString.Text)
orderby s.Name
select new
{
OID = s.OID,
SourceName = s.Name,
StartDate = s.StartDateSubscription,
EndDate = s.EndDateSubscription
};

where içinde sourceType ı kontrol ettiğimiz sözcüğün başına sonuna parantez ekleyip parantezin içine ||(or) yazıp yanına da condition'u yazıyoruz.

Yine dolandırıp dolandıp anlattım galiba. Umarım işinizi görür ve umarım yazıyı toparlamak için vakit bulabilirim...

LINQ ile stored procedure den gelen değeri (SCOPE_IDENTITY) almak

  • Merhaba,
    Öncelikle yazıyı özensiz şekilde hazırladığım için kusura bakmayın. Boş vakit bulduğumda (tabi bulabilirsem) düzenlemeye çalışacağım.,

LINQ ile çalışırken bir tabloya insert eden prosedürden gelen SCOPE_IDENTITY() verisini almak umduğumdan biraz daha karmaşıkmış. Aşağıda basit bir şekilde anlatmaya çalışacağım.

1-)Prosedürümüzü ID gönderecek şekilde düzenleyelim

Sadece OID ve Name alanı bulunan source adında bir tablomuz olsun. Bunun insert'i için yazacağımız prosedür aşağıdaki gibi olmalı

ALTER procedure [dbo].[TR_InsertSource]
@OID int OUTPUT,
@Name nvarchar(255)
AS
insert into source
( [Name] )
VALUES
( @Name )

set @ID= cast(SCOPE_IDENTITY() AS INT)

2-)Prosedürümüzü ve ilgili tabloyu DBML'e ekleyelim

bu kısım için detaylı açıklamayı vakit bulursam ekleyeceğim :(

3-)insert işlemi yapılacak tablo için Dbml deki değişikliklerimizi yapalım

  • Aşağıda gördüğünüz gibi DBML dosyası üzerinde insert yapılacak tabloyu tıklıyoruz 
  • Properties menüsünden insert alnına tıklıyoruz (use Runtime üzerine)

  • aşağıdaki gibi bir pencere açılacaktır

  • Burada Customize radiobutton unu seçiyoruz
  • çıkan dropdowndan stored procedure mizi seçiyoruz (benim kullandığım TR_InsertSource)
  • oiD olarak tanımladığımız alanın karşısında identity alan adımızın olduğundan emin olalım (OID)
  • sonra da OK butonuna basalım
  • Properties penceresi aşağıdaki gibi olacaktır:
  • 3-)Kodumuzu güncelleyelim

    • öncelikle yeni OID değerini tutacak bir değişken yaratalım:
    int? sourceID = 0;
    
    • şimdi prosedürü çalıştıracak kodu yazalım:

    MDDBDataContext dc = new MDDBDataContext();

    dc.TR_InsertSource(ref sourceID, txtName.Text)

    prosedürün içine yazdığımız ref sourceID sayesinde yukarda integer olarak tanımladığımız sourceID alanına yeni OID değeri kaydedilecektir.
    
    • şimdi de prosedürü çalıştıralım

    dc.SubmitChanges();

    kodun son hali aşağıdaki gibi olacaktır :

    int? sourceID = 0;
    MDDBDataContext dc = new MDDBDataContext();
    dc.TR_InsertSource(ref sourceID, txtName.Text)
    dc.SubmitChanges();

    artık sourceID'yi istediğiniz gibi kullanabilirsiniz.
    
    Umarım işinize yarar...
    

    Crystal Reports'u sunucuya tanıtmak

    Merhabalar,

    Uzun uğraşlar sonucunda müşterinin istediği tasarıma uygun raporları yaptınız, testleriniz bitti herşey tamam. Artık müşterinin deneyebilmesi için test server'a veya yeni bir projeyse production server'a atma vakti geldi. O da ne! çalışmıyor mu? "Could not load file or assembly 'CrystalDecisions.Web, Version=10.5.3700.0, Culture=neutral, PublicKeyToken=692fbea5521e1304' or one of its dependencies. The system cannot find the file specified." gibi bir hata alıyorsanız yapmanız gereken şey çok basit!

    Eğer VS.NET2008 kullanıyorsanız muhtemelen şu klasörde:"C:\Program Files\Microsoft SDKs\Windows\v6.0A\Bootstrapper\Packages\CrystalReports10_5" "CRRedist2008_x86.msi" adında bir dosya bulunmalıdır.(endişelenmeyin belirttiğim path içinde yoksa yazıya ekledim). uygulamayı kuracağınız makinede bu dosyayı çalıştırıp crystal report'u register etmeniz yeterli olacaktır.

    Not: Şimdilik sadece vs.net2008 ile gelen versiyon için karşılaştığım problemin çözümünü yazabildim. Fırsat bulabilirsem en kısa zamanda güncelleyeceğim. Umarım sizin de işinize yarar!

    CRRedist2008_x86.rar (15,19 mb)

    Url Rewriting

            Sanırım web de dolaşırken siz de çok kez ismini duymuş ya da farklı farklı sitelerde uygulamalarını görmüşsünüzdür. Eğer neden sitenizde urlrewriting olması gerektiğini ve sitenize nasıl uygulayabileceğinizi merak ediyorsanız tam yerine geldiniz.

     

    Sağladıkları:

    1. Sitenizin arama motorları tarafından daha detaylı indexlenir
    2. Lamerlerin querystringlerinizle oynayıp bir şeyleri karıştırmasını engeller
    3. Kullanıcıya daha hoş görünen bir adrese sahip olursunuz


           Normalde sitemizde bir makale yayınladığımız zaman adresi:

                     www.recepguzel.com/?articleID=1234 gibi olur.

           Url Rewriting sonrasında ise:

                     www.recepguzel.com/1234/Url-Rewriting-Nedir gibi bir adrese sahip olabiliriz.

            Özelliklerinden kısaca bahsetmeye çalıştıktan sonra şimdi de nasıl yapabileceğimize bakalım.

             Aslında işlem temelde 3 aşamadan oluşuyor:

       1-)IIS tarafındaki değişiklikler(Windows XP Pro için)

            IIS tarafında yapacağımız ufacık bir işlem yeterli olacaktır

    • IIS’i açıyoruz ve url rewriting özelliği eklemek istediğimiz website/vdirectory üzerine sağ tıklayıp properties(özellikler)’e tıklıyoruz
    • Virtual Directory/Web site tabı içerisinde Configuration düğmesine tıklıyoruz
    • Karşımıza aşağıdaki gibi bir ekran gelecek, burada Add butonuna tıklıyoruz
    • Açılan ekrandaki browse butonuna basıp “aspnet_isapi.dll” dosyasını buluyoruz.

      Genellikle bu adreste bulunur: C:\WINDOWS\Microsoft.NET\Framework\v2.0.50727\aspnet_isapi.dll
    • Extension alanına “.*” yazıyoruz.
    • Limit to alanına “GET,HEAD,POST” yazıyoruz.
    • Son olarak da Check that file exist checkboxunun seçimini kaldırıyoruz.
    • Çıkan diğer ekranlara OK OK diyerek işin iis fazını bitirmiş oluyoruz.

    Not: Windows server 2003 üzerinde Virtual Directory üzerinde Configuration üzerine tıkladığımızda farklı bir ekran gelir.

    Çıkan ekranda Application extentions yerine Wildcard application maps altındaki insert butonuna tıklamanız gerekmektedir.

    Burada yine xp'de olduğu gibi aspnet_isapi.dll'i browse edip, Verify that file exist kutucuğunun checkini kaldırıyoruz ve OK ile işlemi kaydediyoruz.

         2-)Web.config de yapılması gereken değişiklikler :

            Aşağıdaki satırları web.config içersinde gerekli yerlere yapıştırıyoruz

                 a.) <configSections> tagları arasına aşağıdaki kodu yapıştıryoruz:

    <section name="rewriter" requirePermission="false" type="Intelligencia.UrlRewriter.Configuration.RewriterConfigurationSectionHandler, Intelligencia.UrlRewriter"/> 

                 b.) <httpModules>  tagları arasına aşağıdaki kodu yapıştırıyoruz:

    <add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule, Intelligencia.UrlRewriter"/>

                 c.) <system.webServer> tagları arasına aşağıdaki kodu yapıştırıyoruz:

    <modules runAllManagedModulesForAllRequests="true">
    <
    add name="UrlRewriter" type="Intelligencia.UrlRewriter.RewriterHttpModule" /> </modules>
    <!--[if !supportLineBreakNewLine]-->
    <!--[endif]-->
                 Eğer yoksa Aşağıdaki kodu da aynı blok içine yazıyoruz:          

    <!--[if !supportLists]-->
    <validation validateIntegratedModeConfiguration="false" />

     

                 d.)Son olarak <configuration> tagı içine aşağıdaki kodu yapıştırıyoruz:

    <rewriter>
    <
    rewrite url="/([0-9]{6})(.*)/(.*)-(.*)" to="~/ArticleDetail/default.aspx?aid=$1"/>
    </
    rewriter>
    <!--[if !supportLineBreakNewLine]--><!--[endif]-->

                 Not:Burada benim makale gösterdiğim sayfam ArticleDetail klasörü içinde default.aspx olduğu için bu şekilde edit ettim, siz kendi sitenize göre değiştirebilirsiniz). Ayrıca rewriter url içine yazdığım ([0-9]{6}) regex komutunu yalnızca 6 karakterli rakamlarla sınırlamak için kullandım. siz kodunuzda  bu kısmı kaldırabilirsiz. Şu an ki hali "/123456/merhaba-dunya" şeklindeki formata göre yazılmıştır.

      3-) Classımızda yapılacak değişiklikler

                 Class da bir değişiklik yapmadan önce referanslarımız arasına “Intelligencia.UrlRewriter.dll” dosyasını eklememiz gerekiyor. Sonra aşağıdaki fonksiyonu makaleye link verdiğimiz yani; makaleleri listelediğimiz sayfanın class ı içine kopyalıyoruz(bunu ayrı bir helper class ına da atabilirsiniz)

    C# kodu: 

    public static string GenerateURL(object Title, object strId)

            {

                //Article’ın konusu

                string strTitle = Title.ToString();

                 #region Generate SEO Friendly URL based on Title

                //boşlukları trimleyelim.

                strTitle = strTitle.Trim();

                strTitle = strTitle.Trim('-');

                strTitle = strTitle.ToLower();

                char[] chars = @"$%#@!*?;:~`+=()[]{}|\'<>,/^&"".".ToCharArray();

                strTitle = strTitle.Replace("c#", "C-Sharp");

                strTitle = strTitle.Replace("vb.net", "VB-Net");

                strTitle = strTitle.Replace("asp.net", "Asp-Net");

                 //noktaları da “-“ karakteri ile değiştirelim

                strTitle = strTitle.Replace(".", "-");

                 //Lüzumsuz karakterleri de bi güzel çevirelim

                for (int i = 0; i < chars.Length; i++)

                {

                    string strChar = chars.GetValue(i).ToString();

                    if (strTitle.Contains(strChar))

                    {

                        strTitle = strTitle.Replace(strChar, string.Empty);

                    }

                }

                 //Sıra geldi aradaki boşluklara, onları da “-“ yapalım

                strTitle = strTitle.Replace(" ", "-");

                 //Yanyana gelen “-“lerden de kurtuluyoruz

                strTitle = strTitle.Replace("--", "-");

                strTitle = strTitle.Replace("---", "-");

                strTitle = strTitle.Replace("----", "-");

                strTitle = strTitle.Replace("-----", "-");

                strTitle = strTitle.Replace("----", "-");

                strTitle = strTitle.Replace("---", "-");

                strTitle = strTitle.Replace("--", "-");

                 strTitle = strTitle.Trim();

                 //Halâ “-“ var mı acaba?

                strTitle = strTitle.Trim('-');

                #endregion

                 //Şimdi de linki istediğimiz şekle çeviriyoruz

                strTitle = "~/Article/" + strTitle + "-" + strId + ".aspx";

                 return strTitle;

    }

    VB.NET Kodu:

    Public Shared Function GenerateURL(ByVal Title As Object, ByVal strId As Object) As String
       
       
        'Article’ın konusu
       
        Dim strTitle As String = Title.ToString()
       
        '#Region "Generate SEO Friendly URL based on Title"
       
        'boşlukları trimleyelim.
       
        strTitle = strTitle.Trim()
       
       
        strTitle = strTitle.Trim("-"c)
       
       
        strTitle = strTitle.ToLower()
       
        Dim chars As Char() = "$%#@!*?;:~`+=()[]{}|\'<>,/^&"".".ToCharArray()
       
        strTitle = strTitle.Replace("c#", "C-Sharp")
       
        strTitle = strTitle.Replace("vb.net", "VB-Net")
       
        strTitle = strTitle.Replace("asp.net", "Asp-Net")
       
        'noktaları da “-“ karakteri ile değiştirelim
       
        strTitle = strTitle.Replace(".", "-")
       
        'Lüzumsuz karakterleri de bi güzel çevirelim
       
        For i As Integer = 0 To chars.Length - 1
           
           
            Dim strChar As String = chars.GetValue(i).ToString()
           
            If strTitle.Contains(strChar) Then
               
               
                   
                strTitle = strTitle.Replace(strChar, String.Empty)
               
            End If
        Next
       
        'Sıra geldi aradaki boşluklara, onları da “-“ yapalım
       
        strTitle = strTitle.Replace(" ", "-")
       
        'Yanyana gelen “-“lerden de kurtuluyoruz
       
        strTitle = strTitle.Replace("--", "-")
       
        strTitle = strTitle.Replace("---", "-")
       
        strTitle = strTitle.Replace("----", "-")
       
        strTitle = strTitle.Replace("-----", "-")
       
        strTitle = strTitle.Replace("----", "-")
       
        strTitle = strTitle.Replace("---", "-")
       
        strTitle = strTitle.Replace("--", "-")
       
        strTitle = strTitle.Trim()
       
        'Halâ “-“ var mı acaba?
       
        strTitle = strTitle.Trim("-"c)
       
        '#End Region
       
        'Şimdi de linki istediğimiz şekle çeviriyoruz
       
        strTitle = ("~/Article/" & strTitle & "-") + strId & ".aspx"
       
        Return strTitle
    End Function

                    Kod bloğumuzu da kopyaladıktan sonra artık link vermeye hazırız.

     

                   Normalde bu şekilde vermemiz gereken linki:

                string url =”articledetail.aspx?ArticleId=1234”;

         bu şekilde veriyoruz :

                string url =GenerateURL(Title,ArticleId).ToString());

    Not: Orijinal urlrewriter dosyasını kullandığımda aşağıdaki problemi yaşadığım için dll'i googlebot hatasına karşı editledim. isterseniz editlenmiş halini sayfanın sonundaki linkten indirebilirsiniz.

    Exception type: HttpException
    Exception message: Cannot use a leading .. to exit above the top directory.

      Intelligencia.UrlRewriter.rar (18,15 kb)