3.939 messaggi dal 28 gennaio 2003
Ho in una tabella Access, una lista di nomi.
Voglio, per esempio, trovare tutti i record che contengono il nome Maria, indipendentemente da maiuscole-minuscole

Per esempio, dovrei trovare:
rossi maria
rossi anna maria paola
maria paola rossi

non dovrei trovare invece
rossi annamaria
rossi mariapaola


con sql non vedo come potrei fare.
Con le espressioni regolari ho provato questa
\bMaria\b

e forse con un ciclo si potrebbe fare

cerco qualche idea, magari con l'uso di linq

ciao
Modificato da pietro09 il 12 dicembre 2013 12.16 -
103 messaggi dal 04 ottobre 2010
Se usi EF, con linq sarebbe:

Regex Rex=new Regex("\\bMaria\\b",RegexOptions.IgnoreCase); (non mettere il secondo parametro nel costruttore se invece ti interessa che sia case-sensitive
var persone = PersoneList.Where(p=>Rex.IsMatch(p.Nome));

Se devi usare un comando SQL invece la questione si complica, devi importare una funzione CLR che puoi creare a mano con C# VB.NET ecc ecc.., ma sicuramente usare questa soluzione può aprire le porte verso un mondo interessantissimo per quanto sicuramente lontano da ogni standard SQL:
http://msdn.microsoft.com/en-us/library/w2kae45k%28v=vs.80%29.aspx
103 messaggi dal 04 ottobre 2010
Dimenticavo il fatto che usi access, quindi non credo si possa fare il punto numero 2, ma lo lascio nel caso possa servire saperlo.
103 messaggi dal 04 ottobre 2010
Errata corrige #2: con Linq lo puoi fare soltanto fuori dal context, insomma dentro il context EF non lo permette perché non può scrivere il linq-to-sql di una funzione Regex. Scusa l'errore, il filtro con Linq lo puoi applicare dopo, ma ovviamente a livello di prestazioni, meglio la soluzione CLR (che non so se puoi attuare con Access...)
Modificato da Biohazard il 12 dicembre 2013 15.16 -
3.939 messaggi dal 28 gennaio 2003
Non ho il codice che ho fatto fino ad adesso a portata di mano.
Domani studierò meglio i tuoi consigli.
Per adesso grazie.

ciao.
3.939 messaggi dal 28 gennaio 2003
ho fatto qualche prova. Il codice di sotto sembra andare.
Anche se non mi pare proprio ottimizzato.


    Protected Sub Button1_Click(sender As Object, e As System.EventArgs) Handles Button1.Click
        Dim nome As String = Me.TextBox_nome.Text.Trim

        Dim nomi As String() = nome.Split(New Char() {" "c}, StringSplitOptions.RemoveEmptyEntries)
        Dim pattern As String = ""

        'condizione AND per la ricerca
        For i As Integer = 0 To nomi.Length - 1
            pattern &= String.Format("(?=.*\b{0}\b)", nomi(i))
        Next

        Dim dt As DataTable = msole.GetDataTable(gl.StringaConnessioneRubrica, "select id_personale, cognome_nome, telefono, cellulare, indirizzo_posta from q_personale where 1=1 order by cognome_nome")

        If Not String.IsNullOrWhiteSpace(nome) Then
            Dim result As Integer() = dt.AsEnumerable().Select(Function(c) New With
                                {
                                    .id = CInt(c("id_personale")),
                                    .nome = CStr(c("cognome_nome"))
                                }
                            ).
                        Where(Function(c) Regex.IsMatch(c.nome, pattern, RegexOptions.IgnoreCase)).
                        OrderBy(Function(c) c.nome).
                        Select(Function(o) o.id).ToArray()


            Dim keys As String = String.Join(","c, result)

            If String.IsNullOrWhiteSpace(keys) Then
                dt.DefaultView.RowFilter = "1=0"
            Else
                dt.DefaultView.RowFilter = String.Format("id_personale in ({0})", keys)
            End If

        End If

        If dt.DefaultView.Count = 0 Then
            Me.Literal1.Text = "Nessun nome trovato"
        Else
            Me.Literal1.Text = l.getTableFromDataView(dt.DefaultView)
        End If


    End Sub

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.