LINQtoSQL -> LINQtoXML

Guardando un pò di video in rete ho potuto scoprire una funzionalità di LINQ che non conoscevo per nulla.

LINQ offre la possibilità di creare file XML "al volo" specificando la sorgente dei dati.
Tutto questo è fattibile grazie alle seguenti nuove classi:

System.Xml.Linq 

I seguenti esempi si basano sul database di esempio AdventureWorksDB.msi installato SQL Express.

Creazione di un file XML da una sorgente dati.

Una volta creato il DataContext tramite il file dbml (chiamato per l'occasione AdventureWorks), ho importato la vista vEmployee:

vEmployee 

Fatto questo si procede con il seguente codice:

            AdventureWorksDataContext db = new AdventureWorksDataContext();
                                                                           
            db.Log = Console.Out;                                          
                                                                           
            XElement xel = new XElement("Result",                          
                from c in db.vEmployees                                    
                where c.City == "Seattle"                                  
                where c.FirstName.Length >= 5                              
                select new XElement("Employee",                            
                    new XAttribute("EmployeeID", c.EmployeeID),            
                    new XElement("FirstName", c.FirstName),                
                    new XElement("JobTitle", c.JobTitle)                   
                    ));                                                    
                                                                           
            FileStream fs = File.OpenWrite("Result.xml");                  
            StreamWriter sw = new StreamWriter(fs);                        
            sw.Write(xel.ToString());                                      
            sw.Close();                                                    
            fs.Close();                                                    

Il codice di sopra genererà i file xml Result.xml che conterrà un set di dati:

Result.xml

Per un'esaustiva spiegazione della classe XElement, fate riferimento alle MSDN.

Join fra dati ottenuti da file xml.

Importo nel mio DataContext altre due tabelle presenti nel database AdventureWorks:

  • SalesPerson
  • Contact
  • Employee

LINQ, quando vengono importate delle tabelle, si occuperà della gestione delle relazioni.
Quindi, una volta portate le due tabelle nel vostro file dbml, vedrete graficamente la relazione tra la tabella SalesPerson, la tabella Contact e la tabella Employee:

Relationship 

Le relazione sono basaste, per Employee con il campo EmployeeID con il campo SalesPersonID della tabella SalesPerson.
E la tabella Employee con la tabella Contact tramite il campo ContactID.

Genero tre file xml che conterranno i dati presenti nelle tabelle e che ci serviranno per la dimostrazione:

  • SalesPersons.xml
            AdventureWorksDataContext db = new AdventureWorksDataContext();
            XElement xel = new XElement("SalesPersons",                    
                from c in db.SalesPersons                                  
                select new XElement("SalesPerson",                         
                    new XElement("SalesPersonID", c.SalesPersonID),        
                    new XElement("SalesLastYear", c.SalesLastYear)));      
            FileStream fs = File.OpenWrite("SalesPersons.xml");            
            StreamWriter sw = new StreamWriter(fs);                        
            sw.Write(xel.ToString());                                      
            sw.Close();                                                    
            fs.Close();                                                    
  • Contacts.xml
            AdventureWorksDataContext db = new AdventureWorksDataContext();
            XElement xel = new XElement("Contacts",                        
                from c in db.Contacts                                      
                select new XElement("Contact",                             
                    new XAttribute("ContactID", c.ContactID),              
                    new XElement("FirstName", c.FirstName),                
                    new XElement("LastName", c.LastName),                  
                    new XElement("EmailAddress", c.EmailAddress)));        
            FileStream fs = File.OpenWrite("Contacts.xml");                
            StreamWriter sw = new StreamWriter(fs);                        
            sw.Write(xel.ToString());                                      
            sw.Close();                                                    
            fs.Close();                                                    
  • Employees.xml
            AdventureWorksDataContext db = new AdventureWorksDataContext();
            XElement xel = new XElement("Employees",                       
                from c in db.Employees                                     
                select new XElement("Employee",                            
                    new XAttribute("EmployeeID", c.EmployeeID),            
                    new XElement("LoginID", c.LoginID),                    
                    new XElement("Title", c.Title)));                      
            FileStream fs = File.OpenWrite("Employees.xml");               
            StreamWriter sw = new StreamWriter(fs);                        
            sw.Write(xel.ToString());                                      
            sw.Close();                                                    
            fs.Close();                                                    

Adesso, ipotizziamo che questi tre files non sono stati creati da noi ma sono stati mandati da un nostro cliente tramite dei vecchi applicativi, questo ci chiede di creare un nuovo file xml dove, in base al SalesPersonID del primo file, può ritrovare dati presenti nel file Contacts.xml e Employess.xml, ecco come LINQ ci verrà in aiuto:

            XElement employees = XElement.Load("Employees.xml");                        
            XElement contacts = XElement.Load("Contacts.xml");                          
            XElement salesPersons = XElement.Load("SalesPersons.xml");                  
                                                                                        
            XElement xel = new XElement("NewContacts",                                  
                from s in salesPersons.Elements("SalesPerson")                          
                join e in employees.Elements("Employee")                                
                on (int)s.Element("SalesPersonID") equals (int)e.Attribute("EmployeeID")
                join c in contacts.Elements("Contact")                                  
                on (int)e.Attribute("EmployeeID") equals (int)c.Attribute("ContactID")  
                select new XElement("NewContact",                                       
                    e.Attribute("EmployeeID"),                                          
                    c.Element("FirstName"),                                             
                    c.Element("LastName"),                                              
                    c.Element("EmailAddress"),                                          
e.Element("Title"), s.Element("SalesLastYear"))); FileStream fs = File.OpenWrite("NewContacs.xml"); StreamWriter sw = new StreamWriter(fs); sw.Write(xel.ToString()); sw.Close(); fs.Close();

in pratica, come prima utiliziamo gli XElement come sorgenti dati e facciamo le join che ci servono per poter ottenere i dati dai vari file xml.

Il risultato ottenuto sarà:

 NewContacts.xml

Strabiliante :D

Per qualsiasi dubbio vi consiglio di far riferimento a questo video:

http://www.microsoft.com/emea/msdn/spotlight/sessionh.aspx?videoid=317

Buon divertimento!!!

Tags:

posted @ sabato 7 giugno 2008 20:10

Print
Comments have been closed on this topic.