posts - 82, comments - 0, trackbacks - 0

My Links

News

Archives

Post Categories

C# Download

Facebook

Informativa cookie

Linkedin

Microsoft

Msdn Gallery

Twitter

VisualBasic

Wiki Tecknet

Filtri di ricerca dinamici con LinqToSql

Questo esempio spiega come eseguire filtri di ricerca dinamici con una o più condizioni mediante l'utilizzo di LinqToSql.

Per poter provare questo esempio e nacessario disporre sul pc del net.framework4.0 e l'sdk PowerPacks disponibile a questo indirizzo .

Linq noto come Language-Integrated Query e stato introdotto con l'avvento di VisualStudio 2008 ed e parte integrante all'interno del netFramework dalla versione 3.5 ad oggi.Linq e una tecnologia con la quale e possibile interrogare oggetti in memoria, campi all'interno delle tabelle di un DataBase , file xml e molto altro in modo semplice e conciso , si suddivide in diversi dataprovider trà i quali abbiamo LinqToObjects ,LinqToXml , LinqToDataSet,LinqToSql per finire con LinqToEntities utilizzabile con EntityFramework.In questo articolo vedremo alcuni degli operatori detti anche estensionMethod con i quali e possibile eseguire delle query di ricerca su delle Tabelle denominate Person e Job all'interno di un DataBase di tipo SqlCompact.Il progetto dispone di una Classe LinqToSql ,un file.dbml con all'interno il mapping di due tabelle come detto in precedenza.Vedremo l'operatore Where detto anche operatore di restrizione,il quale filtra i dati di una sequenza il base ad un predicato,il quale può essere per esempio selezionare solamente le persone residenti in una città o provincia,l'operatore Join,questo operatore combina dei risultati in base ad una valore chiave , possiamo per esempio unire i dati da una o più tabelle in base in base al nome mediante il metodo Equals e recuperare informazioni da una o più tabelle , l'operatore Distinct , questo operatore non fa altro che eliminare tutti i valori doppi da una sequenza , torna utili se vogliamo un risultato di valori univoci l'operatore OrderBy , questo operatore riordina in senso crescente il risultato della query in base ad un predicato , per esempio ordinara un elenco di persone in base al loro Cognome , infine l'operatore ToList , questo operatore converte il risultato della query in una lista di tipo System.Collection.Generics.List<t>.L'esempio inoltre dispone di un form main dove e possibile creare un DataBase , connettersi ed eseguire le operazioni di inserimento , modifica e cancellazione dei dati dalle tabelle,un form di selezione in base allo stato e sedici mansioni differenti , questo form contiene la query Linq con la quale sarà eseguito il filtro di ricerca dinamico ed infine il Form di anteprima del risultato di ricerca con la quale e poi possibile stampare il contenuto di ricerca eseguito in precedenza.Di seguito la parte di codice più interessante,ovvero quello della Classe search contenente il filtro di ricerca dinamico.   

        //Click event of btnFind
        private void btnFind_Click(object sender, RoutedEventArgs e)
        {
            /*This Linq query performs a search based on what the user selects the Search form,
             * the form includes three RadioButton and CheckBox controls sixteen,
             * first of all check if the user has selected at least one RadioButton and one or more checkboxes,
             * otherwise it will be perceived from a messagebox.
             * Next check out what has been selected, this is by LinqToObjects query,
             * first retrieves the name of the selected RadioButton control and the second the name or names of the selected checkboxes,
             * which is becoming the operator and Where the predicate inside.

             *This query and the search for or interested in the tasks assigned to each person.

                         var result = ctx.GetTable <Job> ()
                         . Where (w => w.ACTIVITY.Equals (_activity.Content.ToString (). ToUpper ()) && w.STATE.Equals (_state.ToUpper ()))
                         . Join (ctx.PERSON, job => job.ID, cust => cust.ID, (job, name) => new {name.NAME, name.SURNAME, name.ADDRESS, name.ZIPCODE, name.CITY} )
                         . OrderBy (a => a.SURNAME)
                         . Distinct ()
                         . ToList ();

             *A check is performed on the Job table if there are people who work a year and a corresponding duty,
             *will join the two tables placed in the Job and person using the ID field will be extracted and all the information
             *of the person or persons who fulfill the conditions specified in Where previous predicate operator,
             *then using the OrderBy operator will be sorted in ascending according to the specified predicate,
             *in this case by name, will be eliminated any double occurrences, and this task Distinct operator,
             *he will remove all occurrences double and the method ToList convert the result of the query
             *that will anominustype type in a list and we'll look at why
             */
            if (Validations.ChechBoxAndRadioButtonChecked(dgvSearch) < 2)
            {
                return;
            }

            var print = new PreviewDialog();
            var _state = string.Empty;

            using (var ctx = new ContactDataContext(Properties.Settings.Default.path))
            {             
                foreach (var myRadioButton in dgvSearch.Children.OfType<RadioButton>().Where(myRadioButton => myRadioButton.IsChecked.Equals(true)))
                {
                   _state = myRadioButton.Content.ToString();
                }

                foreach (var myCheckBox in dgvSearch.Children.OfType<CheckBox>().Where(myCheckBox => myCheckBox.IsChecked.Equals(true)))
                {
                    var _activity = myCheckBox;
                    var result =  ctx.GetTable<JOB>()
                        .Where(w =>w.ACTIVITY.Equals(_activity.Content.ToString().ToUpper()) && w.STATE.Equals(_state.ToUpper()))
                        .Join( ctx.PERSON, job => job.ID, cust => cust.ID,(job, name) => new  {name.NAME, name.SURNAME, name.ADDRESS, name.ZIPCODE, name.CITY })
                        .OrderBy(a => a.SURNAME)
                        .Distinct()
                        .ToList();

                    foreach (var item in result)
                    {
                        /*The method of the class LoadData PreviewDialog populates a list of such Persons passing all the data found by the search query,
                         * which is why we converted the result of the query in a list, in the class PreviewDialog will find the list of
                         * such person and the method LoadData
                         */
                        print.LoadData(item.NAME, item.SURNAME, item.ADDRESS, item.ZIPCODE, item.CITY);
                    }
                }
                print.ShowDialog();
            }
        }

L'esempio corredato di codice è disponibile a questo indirizzo

  

http://code.msdn.microsoft.com/Filtri-di-ricerca-dinamica-3ce7ad22

Print | posted on sabato 25 agosto 2012 01:26 | Filed Under [ Articoli su C# ]

Feedback

No comments posted yet.

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 5 and 1 and type the answer here:

Powered by:
Powered By Subtext Powered By ASP.NET