En iyi yanıtlayıcılar
Linq to sql ile çoklu arama hk.

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.
- Düzenleyen levent_ozturk 26 Haziran 2012 Salı 20:50
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)
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 30 Haziran 2012 Cumartesi 07:01
- Yanıt Olarak İşaretleyen levent_ozturk 30 Haziran 2012 Cumartesi 17:06
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
-
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.
-
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.
-
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.
-
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.ValueDim dc As New DataClasses1DataContext
Dim query As Stringquery = 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 = querySorun 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.DetayIDSyg.
-
"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)
- Yanıt Olarak Öneren Ali Rıza İnceoğlu 30 Haziran 2012 Cumartesi 07:01
- Yanıt Olarak İşaretleyen levent_ozturk 30 Haziran 2012 Cumartesi 17:06
-