Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Pretraga sa našim slovima

[es] :: .NET :: Pretraga sa našim slovima

[ Pregleda: 2810 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

S A J A
Beograd

Član broj: 226539
Poruke: 1867
*.static.sbb.rs.



+412 Profil

icon Pretraga sa našim slovima11.02.2015. u 21:41 - pre 81 meseci
Imam filter koji radi na sledeći način:

Code:
Dim PretragaString As String = RadTextBoxPretraga.Text

Dim query = From nal In RadFormMain.db.Nalozi
            Where
               nal.ImeKlijenta.Contains(PretragaString)
            Select
               ...


Međutim, ne baš inteligentni korisnici upisuju imena nekad sa našim slovima a nekad bez pa to otežava pretragu, tačnije mora dva puta da se traži. Sad sam probao (i uspeo) da napravim da pretraga radi na oba načina, samo me zanima jel ima neka bolja varijanta, malo mi ovo deluje glupo:

Code:
Dim PretragaString As New List(Of String)
PretragaString.Add(RadTextBoxPretraga.Text)
If RadTextBoxPretraga.Text.IndexOf("ć") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("ć", "c"))
If RadTextBoxPretraga.Text.IndexOf("c") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("c", "ć"))
If RadTextBoxPretraga.Text.IndexOf("š") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("š", "s"))
If RadTextBoxPretraga.Text.IndexOf("s") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("s", "š"))
If RadTextBoxPretraga.Text.IndexOf("č") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("č", "c"))
If RadTextBoxPretraga.Text.IndexOf("c") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("c", "č"))
If RadTextBoxPretraga.Text.IndexOf("ž") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("ž", "z"))
If RadTextBoxPretraga.Text.IndexOf("z") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("z", "ž"))
If RadTextBoxPretraga.Text.IndexOf("đ") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("đ", "dj"))
If RadTextBoxPretraga.Text.IndexOf("dj") <> -1 Then PretragaString.Add(RadTextBoxPretraga.Text.Replace("dj", "đ"))

Dim query = From nal In RadFormMain.db.Nalozi
            Where
               PretragaString.Any(Function(x) nal.ImeKlijenta.Contains(x)) 
            Select
               ...
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6021



+4620 Profil

icon Re: Pretraga sa našim slovima11.02.2015. u 22:35 - pre 81 meseci
Mozes da iskoristis collate na bazi za te poslove. Pogledaj vise detalja kako da uklonis diakritike i kako da nateras SQL da ih ignorise u pretrazi. Medjutim, sam LINQ to ne podrzava, moraces da radis intervencije na bazi.

http://stackoverflow.com/quest...ation-and-case/8144930#8144930

A ako pozivas direktno SP ili SQL, mozes i da iskoristi privremenu kolaciju u stripovani format:

Code (sql):
SELECT * FROM T1
WHERE Ime COLLATE SQL_Latin1_General_CP1_CI_AI LIKE '%ic%'


rezultat:
Mića
MašniČistač
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

S A J A
Beograd

Član broj: 226539
Poruke: 1867
*.static.sbb.rs.



+412 Profil

icon Re: Pretraga sa našim slovima15.02.2015. u 21:33 - pre 81 meseci
Sve radim preko EF-a pa i rešenje mora da bude u okviru njega. Posle duže zezancije, uspeo sam da nađem rešenje.


Prvo sredim string koji upiše korisnik:

Code:
    <System.Runtime.CompilerServices.Extension> _
    Public Function SrediZaPretragu(s As [String]) As String

        s = s.ToLower.Replace("ć", "c")
        s = s.ToLower.Replace("č", "c")
        s = s.ToLower.Replace("đ", "dj")
        s = s.ToLower.Replace("ž", "z")
        s = s.ToLower.Replace("š", "s")

        Return s.ToLower
    End Function



Code:
Dim PretragaString As String = RadTextBoxPretraga.Text.SrediZaPretragu



Linq...

Code:
Dim query = From nal In RadFormMain.db.Nalozi
            Where
               nal.ImeKlijenta.ToLower.Replace("ć", "c").Replace("č", "c").Replace("đ", "dj").Replace("ž", "z").Replace("š", "s").Replace("Ć", "c").Replace("Č", "c").Replace("Đ", "dj").Replace("Ž", "z").Replace("Š", "s").Contains(PretragaString)
            Select
               ...



Sve bi bilo jednostavnije kad bi kreatori EF-a dozvolili upotrebe funkcija u linq upitima (što traži jedno par miliona ljudi) pa bi to izgledalo ovako:

Code:
Dim query = From nal In RadFormMain.db.Nalozi
            Where
               nal.ImeKlijenta.SrediZaPretragu.Contains(PretragaString)
            Select
               ...


[Ovu poruku je menjao S A J A dana 15.02.2015. u 22:48 GMT+1]
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12799



+4740 Profil

icon Re: Pretraga sa našim slovima15.02.2015. u 22:48 - pre 81 meseci
Citat:
S A J A:
Sve bi bilo jednostavnije kad bi kreatori EF-a dozvolili upotrebe funkcija u linq upitima (što traži jedno par miliona ljudi) pa bi to izgledalo ovako:

Code:
Dim query = From nal In RadFormMain.db.Nalozi
            Where
               nal.ImeKlijenta.SrediZaPretragu.Contains(PretragaString)
            Select
               ...

Imas li neki predlog kako da to urade?
 
Odgovor na temu

S A J A
Beograd

Član broj: 226539
Poruke: 1867
*.static.sbb.rs.



+412 Profil

icon Re: Pretraga sa našim slovima15.02.2015. u 23:09 - pre 81 meseci
Citat:
Shadowed: Imas li neki predlog kako da to urade? :)


Naravno da nemam, neka se snađu. Ako može da se napravi nuklearna bomba onda može i jedna funkcija da radi u linq upitu. Uostalom, ako im radi Replace i još neke funkcije, onda definitivno da može. Nego sve to lenjo, daju rezultate na kašičicu, treba da čekaš verziju EF14 da bi nešto uradili. Baš njih briga što sam ja izgubio par sati da dođem do onoga gore što sam napisao. A pogotovo što mi onakav ružan kod bode oči.
 
Odgovor na temu

Shadowed
Vojvodina

Član broj: 649
Poruke: 12799



+4740 Profil

icon Re: Pretraga sa našim slovima16.02.2015. u 00:24 - pre 81 meseci
Stvar je u tome da neke standardne funkcije iz .net framework-a imaju svoje ekvivalente u SQL-u pa su za njih uradili generisanje odgovarajuceg SQL-a. Tu spada i Replace. Medjutim, za tvoju custom funkciju ne mogu da generisu SQL u EF-u. Ako ne previdjam nesto, jedini nacin bi bio da se dovuku svi podaci pa onda uradi na aplikativnom nivou filtriranje. A to mozes i sada.
 
Odgovor na temu

[es] :: .NET :: Pretraga sa našim slovima

[ Pregleda: 2810 | Odgovora: 5 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.