none
Çoklu Parametreli Sorgulama RRS feed

  • Soru

  • Merhaba arkadaşlar bir şey öğrenmek istiyorum. Mesela bir sorgulama yaptırmak istiyorum. Bu sorgulamanın birden fazla parametresi var. Örneğin Sahibinden sitesinde il ilçe satılık kiralık v.s birden fazla parametre seçiyoruz daha sonra sorguluyoruz.

    Bunu Linq ile yapmak istersem bunu nasıl yapabilirim. Veya başka kolay bir yolu var mı?

    10 Ocak 2016 Pazar 23:33

Yanıtlar

  • Databaseinin ne oldugunu soylememissin :( Linq diyorsun, muhtemelen SQL serisi bir database (olmayabilir tabii ama NoSQL ise Linq destegi olsa da kullanmak gereksiz olabilir). Sahibinden gibi yerler, bu is icin SQL serisi database kullanmiyor.

    Linq ile temel olarak iki yontem var:

    1) where ( x != null || x == aranan ) && ( y != null || y == aranan2 )...

    2) if ile bir dizi where kullanmak.

    Where( kosul & kosul & ... ) ise olmaz.

    1.ye ornek (LinqToSQL):

     
    void Main()
    {
      string country = ""; //"Brazil"
      string city = ""; //"Sao Paulo"
      DateTime? orderDate = null; //new DateTime(1996,8,28);
      
      var data = db.Orders
        .Where (c => string.IsNullOrEmpty(country) || c.ShipCountry.StartsWith(country) )
        .Where (c => string.IsNullOrEmpty(city) || c.ShipCity.StartsWith(city) )
        .Where (c => orderDate == null || c.OrderDate == orderDate);
        
    }
    

      2. Yol ile IQueryable kullanabilir ve sartlarini if () bloklariyla ekleyebilirsin.

    void Main()
    {
      string country = ""; //"Brazil"
      string city = ""; //"Sao Paulo"
      DateTime? orderDate = null;//new DateTime(1996,8,28);
    
      var data = Orders.AsQueryable();
    
      if (!string.IsNullOrEmpty(country))
      {
        data = data.Where(c => c.ShipCountry.StartsWith(country));
      }
      if (!string.IsNullOrEmpty(city))
      {
        data = data.Where(c => c.ShipCity.StartsWith(city));
      }
      if (orderDate != null)
      {
        data = data.Where(c => c.OrderDate == orderDate);
      }
    }
    Not: 1.Yontem Linq To SQL ile calisir. 2. ise hem Linq To SQL hem de Linq To EF ile calisir.


    • Düzenleyen CetinBasoz 11 Ocak 2016 Pazartesi 10:50
    • Yanıt Olarak İşaretleyen Serkan Canseven 11 Ocak 2016 Pazartesi 13:56
    11 Ocak 2016 Pazartesi 10:48

Tüm Yanıtlar

  • db.Konuts.Where(koşul).Where(koşul).Where(koşul).Where(koşul).Where(koşul)... şeklinde yapabilirsin
    11 Ocak 2016 Pazartesi 08:16
  • Benimde düşüncem buydu fakat bu şekilde performanslı olur mu?
    11 Ocak 2016 Pazartesi 08:57
  • db.Konuts.Where(koşul && koşul && koşul &&...) şeklindede olabilir. Ben bu şekilde kullanıyorum bir sıkıntı yaşamadım. Daha iyi bir yöntemi varsa bilen biri çıkar elbet :)
    11 Ocak 2016 Pazartesi 09:02
  • Tamam teşekkürler bakalım konu burada duruyor yazan olursa seviniriz :)
    11 Ocak 2016 Pazartesi 10:10
  • Databaseinin ne oldugunu soylememissin :( Linq diyorsun, muhtemelen SQL serisi bir database (olmayabilir tabii ama NoSQL ise Linq destegi olsa da kullanmak gereksiz olabilir). Sahibinden gibi yerler, bu is icin SQL serisi database kullanmiyor.

    Linq ile temel olarak iki yontem var:

    1) where ( x != null || x == aranan ) && ( y != null || y == aranan2 )...

    2) if ile bir dizi where kullanmak.

    Where( kosul & kosul & ... ) ise olmaz.

    1.ye ornek (LinqToSQL):

     
    void Main()
    {
      string country = ""; //"Brazil"
      string city = ""; //"Sao Paulo"
      DateTime? orderDate = null; //new DateTime(1996,8,28);
      
      var data = db.Orders
        .Where (c => string.IsNullOrEmpty(country) || c.ShipCountry.StartsWith(country) )
        .Where (c => string.IsNullOrEmpty(city) || c.ShipCity.StartsWith(city) )
        .Where (c => orderDate == null || c.OrderDate == orderDate);
        
    }
    

      2. Yol ile IQueryable kullanabilir ve sartlarini if () bloklariyla ekleyebilirsin.

    void Main()
    {
      string country = ""; //"Brazil"
      string city = ""; //"Sao Paulo"
      DateTime? orderDate = null;//new DateTime(1996,8,28);
    
      var data = Orders.AsQueryable();
    
      if (!string.IsNullOrEmpty(country))
      {
        data = data.Where(c => c.ShipCountry.StartsWith(country));
      }
      if (!string.IsNullOrEmpty(city))
      {
        data = data.Where(c => c.ShipCity.StartsWith(city));
      }
      if (orderDate != null)
      {
        data = data.Where(c => c.OrderDate == orderDate);
      }
    }
    Not: 1.Yontem Linq To SQL ile calisir. 2. ise hem Linq To SQL hem de Linq To EF ile calisir.


    • Düzenleyen CetinBasoz 11 Ocak 2016 Pazartesi 10:50
    • Yanıt Olarak İşaretleyen Serkan Canseven 11 Ocak 2016 Pazartesi 13:56
    11 Ocak 2016 Pazartesi 10:48
  • Sql server kullanıyorum. Benimde düşündüğüm  Where koyup textbox'tan v.b kontrollerden gelen parametleri tek tek yazarak sorgu sonucu döndürmek ama. Performanslı olurmu diye sormak istedim. Başka bir yolu yok galiba.
    12 Ocak 2016 Salı 13:40
  • Buradaki performans düşünceni açar mısın? 

    @Çetin abinin 2. örneğindeki gibi yazdığında çıkan SQL sorgusundan daha performanslı bir SQL sorgusunu nasıl yazmayı düşünüyorsun da o sorgu daha performanslı oluyor? Varsa öyle bir sorgu Linq karşılığını düşünelim.

    SQL bazında düşünürsek performans istiyorsan iki index atarsın, gerekirse sharding mantıklarına gidersin. Bu gibi okumalarda da isolation level'ı düşürmek işine gelebilir (phantom read vb. problemleri dert etmiyorsan). Veri büyüklüğüne göre @çetin abinin hatırlattığı NoSQL gibi çözümlerle hibrit yapılar kurabilirsin.



    12 Ocak 2016 Salı 13:52
    Moderatör
  • Performans konusunda kullanıcı sorgulama yaptığında beklememesi için düşünüyorum. Bu yüzden ilk önce bir fikir almak istedim.

    Teşekkür ederim bilgiler için.

    13 Ocak 2016 Çarşamba 13:50
  • Diyorum ki, sen linq kullanmasaydın performansı nasıl sağlayacaktın ? Bu soruyu yanıtlarsan o kısma yanıt verebiliriz.
    13 Ocak 2016 Çarşamba 13:54
    Moderatör
  • Ben burada bir şey kullanmadım. Linq ve Sql daha önce kullandığım için yine kullanırsam performanslı olurmu bunu öğrenmek için sordum.
    13 Ocak 2016 Çarşamba 14:01