none
Ricerca con Linq RRS feed

  • Discussione generale

  • Buongiorno,

    nella mia applicazione effettuo una semplice ricerca Linq, con cui estraggo le informazioni da una Tabella SOGGETTI, la cui Colonna "Cognome" corrisponde a quanto scritto nel TextBox "txtSearch". Il tutto funziona correttamente e questo è il codice:

    namespace SearchForm
    {
        public partial class Form1 : Form
        {
            EFDemoEntities context;
            //Soggetti sog;

            public Form1()
            {
                InitializeComponent();
            }

            private void btnOk_Click(object sender, EventArgs e)
            {
                context = new EFDemoEntities();
                var query = from c in context.Soggettis
                            where c.Cognome == txtSearch.Text
                            select c;
                soggettiBindingSource.DataSource = query.ToList();       
            }
        }
    }

    Il mio problema è il seguente: ho la necessità di poter scegliere tramite ComboBox se la ricerca da effettuare deve avvenire all'interno della Colonna "Cognome" oppure "Nome". Pertanto ho provato a modificare in questo modo:

    where c.(ComboBox.Items) == txtSearch.Text

    ma la soluzione non funziona. Come posso fare?

    lunedì 20 febbraio 2012 10:00

Tutte le risposte

  • La soluzione più semplice, anche dal punto di vista delle leggibilità del codice, è eseguire due query diverse a seconda del parametro selezionato nella ComboBox.

    In alternativa, dovresti costruire una query dinamica, ma in questo modo perdi gran parte dei benefici dell'uso di LINQ, perché dovresti scrivere la query come stringa.


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 10:16
  • Buongiorno,

    nella mia applicazione effettuo una semplice ricerca Linq, con cui estraggo le informazioni da una Tabella SOGGETTI, la cui Colonna "Cognome" corrisponde a quanto scritto nel TextBox "txtSearch". Il tutto funziona correttamente e questo è il codice:

    namespace SearchForm
    {
        public partial class Form1 : Form
        {
            EFDemoEntities context;
            //Soggetti sog;

            public Form1()
            {
                InitializeComponent();
            }

            private void btnOk_Click(object sender, EventArgs e)
            {
                context = new EFDemoEntities();
                var query = from c in context.Soggettis
                            where c.Cognome == txtSearch.Text
                            select c;
                soggettiBindingSource.DataSource = query.ToList();       
            }
        }
    }

    Il mio problema è il seguente: ho la necessità di poter scegliere tramite ComboBox se la ricerca da effettuare deve avvenire all'interno della Colonna "Cognome" oppure "Nome". Pertanto ho provato a modificare in questo modo:

    where c.(ComboBox.Items) == txtSearch.Text

    ma la soluzione non funziona. Come posso fare?

    ciao

    se metti il tipo in una variabile

    bool isCognome;

    poi nella query farai semplicemente:

    from c in context.Soggettis where (isCognome && c.Cognome.Equals(txtSearch.Text)) || (!isCognome && c.Nome.Equals(txtSearch.Text)
    select c;



    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

    lunedì 20 febbraio 2012 10:37
  • se metti il tipo in una variabile

    bool isCognome;

    poi nella query farai semplicemente:

    from c in context.Soggettis
    where 
    (isCognome && c.Cognome.Equals(txtSearch.Text))
    || (!isCognome && c.Nome.Equals(txtSearch.Text)select c;

    In questo modo funziona correttamente, ma se posso permettermi, questa soluzione mi piace poco perché il codice diventa più difficile da leggere.

    Ovviamente, come sempre, IMHO :-D


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 10:52
  • Grazie ad Antonio Esposito e Marco Minerva per i suggerimenti. Tuttavia, il mio voleva essere un modo per comprendere il meccanismo per poi migliorare ed ampliare il tutto. Ovvero ampliare successivamente le possibilità di ricerca, quindi aggiungere al combobox oltre che Cognome e Nome anche Indirizzo, Codice Fiscale ed altro.. adesso sono più confuso di prima.

    lunedì 20 febbraio 2012 18:13
  • Non era mia intenzione confonderti, perdonami.

    Cosa non ti è chiaro dei suggerimenti che ti abbiamo dato?


    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 18:19
  • ciao

    mi spiace ti sia confuso ancora di più :)

    la programmazione si basa su alcuni principi, in primis l'OOP, poi altri

    io personalmente preferisco scrivere 1 codice unico e non duplicare motivo per cui è nato il mio consiglio

    ovviamente i gusti sono gusti e ognuno ha 1 suoi

    puoi anche usare un approccio del tipo

    var query = context.Table;
    if(isCognome) query = query.Where(x=>x.Cognome=[myvalue]);
    
    etc...
    che ti costruisce la query in modo dinamico senza else che finiscono in SQL sfruttando le expressions di Linq...

    comunque sia, non esiste 1 unica risposta corretta, quindi ti consiglio di trovare da solo la via che più preferisci

    alcuni miei pensieri: http://dotnetlombardia.org/b/tonyexpo/archive/2010/04/21/vediamo-di-anticipare-il-buon-dino-esposito.aspx


    Antonio Esposito [MCT, MCPD, MCTS, MCP]
    dotnetlombardia.org | blog | web | @tonyexpo
    Italy
     

    lunedì 20 febbraio 2012 18:29
  • la programmazione si basa su alcuni principi, in primis l'OOP, poi altri

    io personalmente preferisco scrivere 1 codice unico e non duplicare motivo per cui è nato il mio consiglio

    ovviamente i gusti sono gusti e ognuno ha 1 suoi

    puoi anche usare un approccio del tipo

    var query = context.Table;
    if(isCognome) query = query.Where(x=>x.Cognome=[myvalue]);
    
    etc...
    che ti costruisce la query in modo dinamico senza else che finiscono in SQL sfruttando le expressions di Linq...

    comunque sia, non esiste 1 unica risposta corretta, quindi ti consiglio di trovare da solo la via che più preferisci

    alcuni miei pensieri: http://dotnetlombardia.org/b/tonyexpo/archive/2010/04/21/vediamo-di-anticipare-il-buon-dino-esposito.aspx

    +1

    Marco Minerva [MCPD]
    Blog: http://blogs.ugidotnet.org/marcom
    Twitter: @marcominerva

    lunedì 20 febbraio 2012 18:32
  • Grazie ad entrambi. L'idea è proprio quella di scrivere un codice semplice e riutilizzabile.
    lunedì 20 febbraio 2012 19:36