Quando si parla delle novità del .NET Framework 3.5 non si può non parlare di LINQ. E' innegabile che questa tecnologia sia la novità più importante e che pretenda di cambiare notevolmente la vita agli sviluppatori dato il suo impatto sulla modalità di accesso ai dati, qualsiasi essi siano. Stringhe o file XML, database, entità modellate in classi: tutte queste sorgenti dati diventano interrogabili e modificabili grazie alla sintassi di LINQ.
In questo articolo si parlerà per la maggior parte di "LINQ to SQL" cioè la parte di LINQ che permette, con i provider nativi nel Framework 3.5, il dialogo con database SQL Server (2000, 2005, 2008 ed Express). Altri database potranno essere utilizzati con LINQ quando saranno creati provider appositi (esiste già una versione per MySql, mentre per Oracle c'è una beta al momento della scrittura di questo articolo).
Esempio di LINQ to SQL
Grazie a questa tecnologia, anche uno sviluppatore completamente privo di conoscenza della sintassi SQL potrebbe interrogare un database pur sapendo il meno possibile della struttura presente. Per fare un esempio di come cambia il modo di accedere ad un database, facciamo un paragone tra la modalità di programmazione che sfrutta direttamente ADO.NET e quella che utilizza LINQ. In questo esempio, si recupera il contenuto della tabella "Orders" nel database "Northwind" e lo si mette in una nostra collection.
List<Order> coll = new List<Order>(); using (SqlConnection conn = new SqlConnection(connectionString)) { conn.Open(); using (SqlCommand comm = new SqlCommand("select orderid, orderdate from orders where orderid>1", conn)) { SqlDataReader re = comm.ExecuteReader(); while (re.Read()) { Order o = new Order(); o.OrderId = int.Parse(re["orderid"].ToString()); o.OrderDate = DateTime.Parse(re["orderdate"].ToString()); coll.Add(o); } } } return coll; // Linq con C# DataContext db = new DataContext(connectionString); Table<Order> res = db.GetTable<Order>(); IQueryable<Order> collx = from c in res where c.OrderId > 1 select new Order { OrderId=c.OrderId, OrderDate=c.OrderDate }; List<Order> coll = collx.ToList<Order>(); return coll;
'LINQ con VB Dim db As New DataContext(connectionString) Dim res As Table(of Order) = db.GetTable(of Order) Dim collx As IQueryable(of Order) =From c In res where c.OrderId > 1 _ Select New Order with { _ .OrderId=c.OrderId, _ .OrderDate=c.OrderDate _ } Dim coll As List(of Order)= collx.ToList () Return coll
Utilizzare LINQ to SQL nelle nostre applicazioni
L'esempio riportato nella sezione precedente è molto banale:
- Viene creato un nuovo oggetto "DataContext" - oggetto indispensabile perché crocevia tra la nostra applicazione e la fonte dati
- Viene creato un oggetto "Table" che rappresenterà la tabella nel database
- Nella query specifichiamo quali dati ci interessa recuperare dal database e come questi devono essere esposti una volta ottenuti
Quest'ultimo è un punto importante su cui si fa spesso confusione. La richiesta dati non avviene nel momento in cui si compila la query, bensì quando effettivamente si utilizzano i dati. Nell'esempio, il popolamento dell'array di oggetti "Order" avviene al momento dell'escuzione del metodo ToList sulla variabile collx ottenuta dalla query LINQ e non prima.
Per utilizzare l'esempio, dobbiamo creare una classe che esponga i singoli campi interessati:
using System.Data.Linq.Mapping; [Table(Name = "Orders")] public class Order { [Column(Name = "OrderID", DbType = "int")] public int OrderId { get; set; } [Column(Name = "OrderDate", DbType="datetime")] public DateTime OrderDate { get; set; } }
Import System.Data.Linq.Mapping; <Table(Name = "Orders")> Public Class Order <Column(Name = "OrderID", DbType = "int")> Public Property OrderId as Integer ? <Column(Name = "OrderDate", DbType="datetime")> Public OrderDate As DateTime ? End Class
Gli attributi sono necessari per specificare il mapping della classe sulla tabella nel db. L'attributo Table specifica il collegamento con la tabella mentre Column specifica quello con i campi ed il relativo tipo (necessario solo se il nome della proprietà è differente dal campo all'interno della tabella).
Commenti
Per inserire un commento, devi avere un account.
Fai il login e torna a questa pagina, oppure registrati alla nostra community.
Approfondimenti
What's coming in .NET and C# 8 (.NET Conference Italia 2018)
oggi esce #VS2019. noi vi aspettiamo il 06/06 per un live streaming tutto dedicato alle novità di questa nuova release e di .NET Core 3.info ed iscrizioni su https://aspit.co/VS2019-Live ci saranno anche alcuni posti tra il pubblico. altre info su questi posti a breve.
.NET Core 3, C#8 and beyond
#netcore 3 sarà rilasciato a settembre.#dotnet5 arriverà a novembre 2020, unificando #netfx, #netcore e #xamarinogni novembre ci sarà una major release di .NET#MSBuild https://aspit.co/bu6
le versioni Community, Professional e Enterprise di #VS2019 sono disponibili al download.su #MSDN downloads ci sono anche le chiavi. download a partire da https://aspit.co/bur
rilasciato #netcore31, con SDK e runtime. aggiornamenti anche per #aspnet31, #efcore31, #ef64, #blazor e #VS2019 info e download su https://aspit.co/byj
Tutti i video dell'evento #VS2019 Live saranno pubblicati, uno al giorno, a partire da oggi. https://aspit.co/VS2019-Live Seguici sui social o iscriviti alla nostre newsletter, per restare sempre aggiornato!
Risolvere il bug delle finestre Model Explorer e Mapping details nel designer di Entity Framework su Visual Studio 2019
Clonare un oggetto utilizzando il BinaryFormatter
Aggiungere tag a una query con Entity Framework Core 2.2
Utilizzare la libreria JSON.NET per serializzare un JSON in un dictionary
Agenda di #aspilive su #VS2019 online: https://aspit.co/VS2019-Live con @dbochicchio, @cristiancivera, @sm15455, @kasuken, @leoncini117, @xTuMiOx e @MorganWPi Iscrizioni ancora aperte, vi aspettiamo il 6 giugno!