LINQ
Nel precedente post ho mostrato come le lambda expression non sono assolutamente la stessa cosa che un delegate anonimo, la ragione è che il compilatore può tradurre una lambda expression in due modi molto differenti, il primo è semplice codice IL, proprio come un delegate anonimo, mentre il secondo è un Expression Tree. La IQueryable, che è l'interfaccia utilizzata da LINQ to SQL, accetta quindi nel where due cose distinte, un delegate di tipo Func<T, Boolean> oppure un Expression<Func<T, Boolean>>, il compilatore se presente preferisce sempre compilare con una Expression, ecco perchè LINQ2SQL è in grado di tradurre lo StartsWith()...
Se qualcuno fosse convinto che le lambda expression sono solamente Syntactic Sugar per esprimere delegate anonimi potrà essere piacevolmente sorpreso da questo esempio in LINQ to SQL. FirstTestDataContext context = new FirstTestDataContext();
context.Log = Console.Out;
IEnumerable<Customer> custs = context.Customers
.Where(C => C.CustomerID.StartsWith("A"));
Console.WriteLine("Recuperati {0} oggetti Customer", custs.Count());
custs = context.Customers
.Where(delegate(Customer C) { return C.CustomerID.StartsWith("A"); });
Console.WriteLine("Recuperati {0} oggetti Customer", custs.Count());
In sostanza la prima query usa una lambda expression del tipo C => C.CustomerID.StartsWith("A") e la seconda usa invece un delegate anonimo ma il codice è lo stesso. Osserviamo le query che vengono eseguite.
SELECT [t0].[CustomerID], [t0].[CompanyName], [t0].[ContactName], [t0].[Contact
itle], [t0].[Address], [t0].[City], [t0].[Region], [t0].[PostalCode], [t0].[Cou
try],...
Utilizzando il designer le vostre classi di accesso ai dati conterranno una serie di attributi necessari affinche Linq to Sql possa gestire le operazioni di persistenza dei dati. Se non amate gli attributi e preferite invece file di mapping xml la soluzione è utilizzare l'utility SqlMetal.exe fornita con visual studio, che vi permette di generare tutte le classi per un intero database. Ecco ad esempio come generare tutto il dominio per il database NorthWind sqlmetal /server:LAPTOPVM1SQLEXPRESS /database:northwind /map:NorthwindVer1.map /code:NorthwindVer1.cs La sintassi è veramente facile, basta infatti specificare il nome del server, il database ed i nomi dei file da...
Dopo avere giocato con Linq to entities e linq to xml (che trovo veramente comodo) ho iniziato a giocare con LINQ to SQL. Debbo dire che le prime impressioni sono decisamente buone, il prodotto è sicuramente molto valido e vale la pena guardarlo. La prima considerazione che mi è venuta guardando le classi generate è la trasparenza rispetto all'ORM, utilizzando le oramai straconosciute Customers e Orders del database Northwind, si nota infatti che la relazione è fatta utilizzando due classi speciali la EntityRef<T> e la EntitySet<T>. Queste due classi sono automaticamente utilizzate dal designer per gestire i riferimenti, mentre NHibernate...