Şimdi Ara

Çok Acil - Linq to sql multi where - Predicate Builder

Daha Fazla
Bu Konudaki Kullanıcılar: Daha Az
2 Misafir - 2 Masaüstü
5 sn
21
Cevap
0
Favori
2.305
Tıklama
Daha Fazla
İstatistik
  • Konu İstatistikleri Yükleniyor
0 oy
Öne Çıkar
Sayfa: 12
Sayfaya Git
Git
sonraki
Giriş
Mesaj
  • Merhaba arkadaşlar yapmış olduğum emlak sitesinde çoklu arama özelliği bulunmaktadır. Örneğin kullanıcı konut kısmından aynı anda daire ve Bina arayabilmektedir. Linq kullanımında yeni olduğum için pek fazla bilgim yok. Dynamic linq araştırma yaptım. Fakat istediğimini tam olarak bulamadım. Dynmaic linq oluşturmadan çözümü var mı? Yardımlarınızı bekliyorum.



    < Bu mesaj bu kişi tarafından değiştirildi user2712 -- 17 Mart 2012; 17:02:53 >



  • Linq kullanabilmek için iyi derecede ObjectOriented bilmen gerek. yani aslında binanın ve Dairenin construction tipinde bir Classtan inherit etmesi gerekmekte. yani binaların ve Dairelerin aynı tablo içinde sadece typelerinin bina daire vs oalrak değişmesi gerekmekte. datacontextte ise constructions isimli tabloda hepsinin bir arada tutulması , değişen ve birbirinden farklı ozelliklerinde constructionoptions isimli ayrı bir tabloda keyvaluePair olarak tutulması gerek.sonrasında tüm tabloyu çekmen tabloya ConstructionOptionsları include edip hız açısından da aramayı cachelemen gerekiyor. her ürün eklendiğinde ve değiştirildiriğinde cacheyi resetlemen gerekiyor. Tüm datayı list biçiminde döndürdükten sonra arama kriterlerine göre Listeyi .where komutu ile değer girilen parametrelere göre filtrelemen gerekli



    < Bu mesaj bu kişi tarafından değiştirildi Kaygerya -- 17 Mart 2012; 17:22:37 >
  • Müşteriler o bölümde emlak tipi yani daire, bina, köy evi, dağ evi gibi kriterlerden hangilerinin aramaya ekleneceğini seçiyorlar.[/font>]
  • yani sen dağ evlerini , daireleri , evleri herbirisini ayrı ayrı tablolarda tutuyorsan yazılım açısından yanlış yolda oldugunu hemen gerekli düzenlemeyi yapmayı öneririm. çunku ileride yeni bir ev tipi bişey tiği eklemek istediğinde yeni tablo yaratman gerekir ki bu çok zahmetli bir iş

  • Tabi kide öyle bir hata yapmadım. Demek istediğim kullanıcı listbox tan emlak tiplerini seçiyor. Seçtiği bu emlak tiplerine ait kayıtların getirilmesini soruyorum. Tek kayıt seçimi olsa çok rahat bir şekilde yapılır. Fakat listboxlarda 5 tane tip varsa onların hepsinin aynı anda gelmesi olayı üzerinde çalışıyorum.
  • hmm doğru yolda oduguna sevindim .şimdi filtreleme metodunda 2 yöntem var 1. si listeden atma 2. si listede tutma :)
    şimdi diyelim ki construction tablonda birsürü binalar daireler ev tipleri var.
      
    public List<Construction> GetAllConstructions()
    {
    List<Construction> constructionList = new List<Construction>();
    using (emlakDatacontext dc = new emlakDataContext())
    {
    constructionList = (from c in dc.Constructions select c).ToList();
    //burada tüm tabloyu çektik ama sen buraya cache kontrolu koyup
    // cachede yoksa constructionList i cacheye at cachede var ise
    // database e sorgu atma cacheden getir kontrolunu eklemen lazım
    }
    return constructionList ;
    }


    bu bize tüm tabloyu getirecek gelelim filtreleme kısmına tüm bina tiplerinin birer checkbox oldugunu seçili olanların ise aramaya ekleneceğini düşünelim ve bu listeye eşit değerde bir filteredConstructionList yaratalım
    ConstructionTypes in de içinde constructiontypes bulunduran enum oldugunu düşün 1,2,3,4 vs gibi dağ evi daire bina gibi string değerleri oldugunu düşün

     
    List<Construction> allConstructions = GetAllConstructions();
    List<Construction> filteredConstructionList =new List<Construction>();
    if(chbDagEvi.checked)
    //dağ evi checkboxu seçilmişse
    filteredConstructionList.AddRange (allConstructions.where(t=> t.ConstructionType == (int) ConstructionTypes.DagEvi).ToList()));
    // daire seçilmişse
    filteredConstructionList.AddRange (allConstructions.where(t=> t.ConstructionType == (int) ConstructionTypes.Daire).ToList()));
    // bu şekilde filteredConstructionList imizi seçilen tiplerde doldurduk. şimdi elimizde istediğimiz typlerde construction türünde yapılar var.
    //... böyle böyle gidecek

    //sonra mesela filteredConstructionList imizde sadece daireler ve dağ evleri oldu içlerinde 3+1 olanları da seçti. tüm oda salon tipleri de bir dropdowndan seçiliyor.ve ilk değeri lütfen seçiniz ve valuesi 0 diye düşün
    //yani adam bir oda sayısı tipi belirtmişse filtreleyeceğiz
    if(ddlRoomCount.selectedValue != "0")
    {
    filteredConstructionList = filteredConstructionList.where (r=> r.RoomCount == ddlRoomCount).ToList();
    }
    //yukarıda ne oldu sadece listemizde seçtiğimiz tiplerde ve 3+1 ler kaldı
    //birde bunların yanısıra boğaz manzarası olanları da istedi müşteri yani hem 3+1 hem boğaz manzarası için
    if(chbBogazManzarası.checked)
    {
    //Zaten içinde 3+1 olanların içinde de boğaz manzarası olanlar kalacak
    filteredConstructionList = filteredConstructionList.where (r=> r.BogazManzarası== true).ToList();
    }
    //işte boyle boyle arametrelere göre filteredConstructionList i küçülttük küçülttük elimizde bu kaldı bunu da bir repeate veya list viewe göndük mü müşteri tam istediği tipte daireleri görecek


    işte böyle



    < Bu mesaj bu kişi tarafından değiştirildi Kaygerya -- 17 Mart 2012; 17:54:20 >




  • code blogunun içinde yazdıklarım code gibi gözükmedi neden bilmiyorum editlemeye çalıştım ama . düzelmedi
  • Bu sefer de tablolardaki ilişkileri oluşturamadım.
  • tipik ilişki oluşturma yöntemi


     
    //bir internall class olusturdum. sen normal oluştur
    public internal ContructionWithOptions
    {
    public Construction construction {get;set;}
    public List<ConstructionOptions> constructionOptions {get;set;}
    }

    var query = (from c in dc.Constructions
    join co ConstructionOptions on c.ConstructionID equals co.ConstructionID
    select new ContructionWithOptions
    {
    construction =c,
    constructionOptions = co.ToList()
    }).ToList()



    boylece constructionu optionsarıyla çekebilirsin
  • ben sayfada yazmıyorum kodu direk code tagları içine yazıyorum bu yuzden syntax hatalarını düzeltmen gerekebilir. bilgine. o yuzden eğer optionları ile arama işlemlerini yapacaksan tüm işlemler yani filteredConstructions ve allconstructions işlemlerini List<ConstructionOptions> üzerinden yapman gerekecek
  • quote:

    Orijinalden alıntı: recyclebin1

    Bu sefer de tablolardaki ilişkileri oluşturamadım.

    hallettin herhalde sesin çıkmıyo
  • o değilde niye küçük yazıyorsun arkadaş :) zaten gözümüz bozuluyor bilgisayara bakmaktan :)
  • Teşekkürler. Dediğin yöntemi kullandım bu sefer başka bir sorun ortaya çıktı bende biraz daha harmanlayıp kodu çalışır hale getirdim.
  • yardımım dokunduysa ne mutlu linqcuları ve entitityframweorkçuleri severim :) yardım sonsuzdur. ama bana sql demeyin:)
  • Bilgi paylaşıldıkça çoğalır. Olsun biz sql de severiz :)
  • sql candır :) BI teknolojilerde linq mümkün değil iş görmez. 500-1000 satırlık sql kodları yazdığımız oluyor öyle komplike sorguların içinde linq ve entity framework ile çıkman mümkün değil :)
  • yooo neden çıkamayacaksın ki ? zaten programı derlediğinizde output olarak çalışabilecek en hızlı sql sorgusunu zaten görüyorsunuz. yani ne sorgusu attığınızı görüyorsunuz. aynı zamanda sql tek kanaldan sorguluyor plinq paralel olarak pek çok kanaldan sorguyu çok daha hızlı getiriyor. basit select update sorgularında sql her ne kadar çok hızlı çalışsada komplike sorgularda linq diyorum
  • crystal report içerisinde subreport kullanırken ve komplike sorgulama işleminde resmen sql ile yapacağın işlemi 10 kat daha uzatırsın sorgun yavaş çalışır ve yapma sürende 1 günse 4 gün olur. Ben zaten şuna karşıyım ben linq kullanırım ben sql kullanırım bunlar yanlış şeyler. Ben linq ve entity framework kullanırım, sqlde kullanırım, nosqlde kullanırım. Önemli olan performans ve iş süresi. Bunlara artı olarakta projenin büyüklüğü ve maliyetler tabiki. Ama raporlamalarda crystal reportta falan sql kullanırım. İlla şu yada bu demenin bir anlamı yok. Hangisi performanslı ve daha az süre alıyor onu kullanmak lazım. 1000 satırlık bir sql kodunuda linq ile yapmakta mantıklı bir işlem sayılmaz.
  • Aslında entity'in yararları tartışılmaz fakat performams testleri yaparak projeye için en uygununu kullanmanın mantıklı olduğunu dūşūnmekteyim.
  • şimdi linq entity framework vs yazılımlar bir arakatman oldukları için muhakkak sqlden yavaş çalışırlar. sonuçta bu sorgular once aradile oradan sql diline çevrilirler. "select * from tablo" sorgusu "from u in dc.Tablo select u" sorgusundan daha hızlı çalışacaktır. lakin komplike ve birbiriyle ilişkili tablolarda, linq sql ile arasında muhtemelen 1-2 milisaniye oynayacaktır. lakin Plinq çoklu tablo joinlerinde sql sorgusundan yarıyarıya daha hızlı çalışmaktadır. çünkü sql sorgusu gibi linear değil paralel çalışmaktadır.
  • 
Sayfa: 12
Sayfaya Git
Git
sonraki
- x
Bildirim
mesajınız kopyalandı (ctrl+v) yapıştırmak istediğiniz yere yapıştırabilirsiniz.