none
Linq to sql ile çoklu arama hk. RRS feed

  • Soru

  • Merhaba Arkadaşlar,

    Aşağıdaki arama metodunda veriler arasında istediğim gibi sorgulama yapabiliyorum fakat bunu linq to sql de yapamadım.

                Dim sqlquery As String = "SELECT * FROM View_Veriler WHERE 1=1"

                If TextBox1.Text <> "" Then sqlquery += "AND AD LIKE '%" + TextBox1.Text + "%'"

                If TextBox2.Text <> "" Then sqlquery += "AND SOYAD LIKE '%" + TextBox2.Text + "%'"

                If TextBox3.Text <> "" Then sqlquery += "AND TCNO LIKE '%" + TextBox3.Text + "%'"

                Cmd = New SqlCommand

                Cmd.Connection = Conn

                Cmd.CommandText() = sqlquery

                Adap = New SqlDataAdapter(Cmd)

                Dt = New DataTable

                Adap.Fill(Dt)

                DataGridView1.DataSource = Dt

    Tek alan üzerinde yapıyorum,

            Dim UrunAra = (From c In dc.Uruns _

             Where SqlMethods.Like(c.UrunAd, "%" + TextBox1.Text + "%"))

            DataGridViewUrunStok.DataSource = UrunAra

    fakat sorgulayacağım alan yukarıdaki gibi birden fazla olunca işler karışıyor:)

    Konu hakkında yardımlarınızı rica ediyorum.

    Syg.


    26 Haziran 2012 Salı 20:49

Yanıtlar

  • "Uyarlamaya calistim" lafini es gecmisim:) Hakikaten uyarlamaya calismissin, orijinal yazdiginla ilgisi yok. Isin icine tarih girmis. En iyisi sana calisan ve Northwind tablosunu kullanan ornek vereyim onu uyarla.

    dim country as string  = ""
    dim city as string = ""
    dim orderDate as DateTime? = new DateTime(1996,7,8)
    
    dim data = Orders _
      .Where (function(c) string.IsNullOrEmpty(country) or c.ShipCountry.StartsWith(country) ) _
      .Where (function(c) string.IsNullOrEmpty(city) or c.ShipCity.StartsWith(city) ) _
      .Where (function(c) orderDate is nothing or c.OrderDate = orderDate)

    29 Haziran 2012 Cuma 14:42
    Moderatör

Tüm Yanıtlar

  • Sen hali hazirda SQL ile yanlis yapiyormussun:) Sanirim sana daha once soylemistim, asla boyle:

    + textbox2.Text +

    gibisinden SQL yazma diye. Mutlaka parametre kullan.

    Neyse, linq ile bu is cok kolay ve parametre kullaniyor:

    dim ad as string = TextBox1.Text
    dim soyad as string = TextBox2.Text
    dim tcno as string = TextBox3.Text
    
    Dim query = db.View_Veriler _
        .Where( function(veri) string.IsNullOrEmpty(ad) or veri.Ad = ad ) _
        .Where( function(veri) string.IsNullOrEmpty(soyad) or veri.Soyad = soyad ) _
        .Where( function(veri) string.IsNullOrEmpty(tcno) or veri.TCNo = tcno )
     
    DataGridView1.DataSource = query

    Not: Linq To SQL, bunu SQL server'a gonderirken gereksiz parcalari eklemeyecek kadar akilli davaraniyor. Ornegin parametrelerin hepsi bos ise giden SQL (syntax tam olarak bu degil, ama aynisi sonucta):

    SELECT * FROM View_Veriler

    Bir tane parametre tanimli ise (mesela soyad = "basoz"):

    declare @p0 nvarchar(1000) 
    set @p0 = 'basoz'
    
    SELECT * FROM View_Veriler where soyad = @p0

    27 Haziran 2012 Çarşamba 11:34
    Moderatör
  • Merhaba Çetin Bey,

    Normal de parametre kullanıyorum sizin uyarınızdan sonra bu konuya çok dikkat etmeye çalışıyorum fakat yukarıdaki arama sorgusunda nasıl olduysa gözümden kaçırmışım.. Daha doğrusu bu sql sorgusunda buradaki uzman arkadaşlar yardımcı olmuşlardı fakat benim bunu parametreli hale çevirmem gerekirdi ama gözümden kaçmış.

    Cevabınız ve uyarınız için teşekkür ederim.

    Deneme fırsatı bulduğumda sonucu burada paylaşacağım.

    Saygılar.

    27 Haziran 2012 Çarşamba 12:32
  • Merhaba Çetin Bey,

    Sizin yazdığınız kodu kendi sorguma uyarlamaya çalıştım fakat bir hata aldım.

     1. Sql tarafında oluşturduğum View_Taksitler ‘i DataClasses1.dbml  ye ekledim ( sürükle bırak yöntemi ile)

      

       2. Aşağıdaki gibi değişkenleri tanımladım.

      Dim MustAd As String = txtMusteriAdiAra.Text

            Dim BasTar As String = DtBasTarAra.Value

            Dim BitTar As String = DtBitTarAra.Value

                 Dim query = View_Taksitler _

                .Where(Function(veri) String.IsNullOrEmpty(MustAd) Or veri.MustUnvan = MustAd) _

                .Where(Function(veri) String.IsNullOrEmpty(BasTar) Or veri.TaksitTarih = DtBasTarAra) _

                .Where(Function(veri) String.IsNullOrEmpty(BitTar) Or veri.TaksitTarih = DtBitTarAra)

                DataGridViewTaksit.DataSource = query

    Yukarıda alti çizili kısım hata veriyor açıklama balonunda ise (where is not a member of mobdataB.View_Taksitler) yazmakta.

    View_Taksitler   birbirine join ile bağlı 3 tablo dan oluşmaktadır. Acaba bu kısımda bir sorun olabilir mi ?

    Yardımlarınız için şimdiden teşekkürler.

    Syg.

    27 Haziran 2012 Çarşamba 21:30
  • Ben LinqPad'de yazmaya alistigimdan dogrudan View_Taksitler yazdim. Senin once contexti eklemen gerekli. DBML'ini MyDataClasses olarak olusturdugunu dusunursek:

    MyDataClassesDataContext db = new MyDataClassesDataContext();
    
    var query = db.View_Taksitler ...
    Not: VB.Net yazmak zor geldi, elim hep C#'a gidiyor ama ne oldugu belli.

    28 Haziran 2012 Perşembe 08:56
    Moderatör
  • Merhaba Çetin Bey,

    Yukarıda dediğiniz yaptım fakat verilerim datagridview'e gelmiyor.İşin ilginç tarafı hata da vermiyor:) Sorun nerede çözemedim.

    Belki gözden kaçırdığım bir yer vardır.

    Dim MustAd As String = txtMusteriAdiAra.Text
            Dim BasTar As DateTime = DtBasTarAra.Value
            Dim BitTar As DateTime = DtBitTarAra.Value

            Dim dc As New DataClasses1DataContext
            Dim query As String

            query = dc.View_Taksitlers.Where(Function(veri) String.IsNullOrEmpty(MustAd) Or veri.MustUnvan = MustAd.ToString) _
            .Where(Function(veri) String.IsNullOrEmpty(BasTar) Or veri.TaksitTarih >= BasTar.Date) _
            .Where(Function(veri) String.IsNullOrEmpty(BitTar) Or veri.TaksitTarih <= BitTar.Date).ToString()
       
            DataGridViewTaksit.DataSource = query

    Sorun ne çözemedim Sql tarafında sorun yok (View_Taksitler) aşağıdaki gibi ve çalışıyor.

    SELECT     d.SatisTutar, m.MustKod, m.MustUnvan, t.TaksitTarih, t.TaksitTutar
    FROM         dbo.Detay AS d INNER JOIN
                          dbo.Musteri AS m ON d.MustID = m.ID INNER JOIN
                          dbo.Taksit AS t ON d.ID = t.DetayID

    Syg.

    28 Haziran 2012 Perşembe 22:50
  • "Uyarlamaya calistim" lafini es gecmisim:) Hakikaten uyarlamaya calismissin, orijinal yazdiginla ilgisi yok. Isin icine tarih girmis. En iyisi sana calisan ve Northwind tablosunu kullanan ornek vereyim onu uyarla.

    dim country as string  = ""
    dim city as string = ""
    dim orderDate as DateTime? = new DateTime(1996,7,8)
    
    dim data = Orders _
      .Where (function(c) string.IsNullOrEmpty(country) or c.ShipCountry.StartsWith(country) ) _
      .Where (function(c) string.IsNullOrEmpty(city) or c.ShipCity.StartsWith(city) ) _
      .Where (function(c) orderDate is nothing or c.OrderDate = orderDate)

    29 Haziran 2012 Cuma 14:42
    Moderatör
  • Merhaba Çetin Bey,

    Yardımınız için çok teşekkür ederim.

    Yukarıdaki yazdığınız örnek işimi gördü.

    30 Haziran 2012 Cumartesi 17:06