LINQ
Posts regarding LINQ (Language Integrated Query)
Disquisendo di LINQ presso alcuni clienti mi sono reso conto che molti sviluppatori non ne hanno ben chiaro il funzionamento percui ricorre spesso la frase “Bello, ma LINQ costringe a inutili iterazioni”. Esempio: Prendiamo un array di interi e supponiamo di volere enumerare i valori >10 interrompendo il ciclo quando il valore contenuto è uguale a 12. foreach (int v in values)
{
if (v > 10)
{
Console.WriteLine("Value is: {0}", v);
if (v > 12) break;
}
}
in...
Nei newsgroup ogni tanto si trovano delle domande "stuzzicanti" quella che di recente mi ha incuriosito più di altre è stata "Come faccio a ordinare una query LINQ in base al contenuto di una variabile?" ovvero, è possibile scrivere qualcosa del tipo: string column = "Country";
var ret = from c in db.Customers orderby column select c;
Il codice compila ma non produce ovviamente il risultato sperato, ecco quindi una serie di possibili alternative che ho verificato con una semplice applicazione che vedete qui sotto:
Prima soluzione: (Quick & Dirty) Mega-switch e creare le...
Partendo da questo ottimo articolo di Janky, ho fatto fatto qualche prova con il metodo Attach del DataContext ottenendo dei risultati inizialmente inattesi che comunque rispettano quello che è il comportamento tipico del DataContext. Ho utilizzato questo banale esempio con l'intento di simulare uno scenario: Pagina1: Leggo un dato e lo modifico Pagina2: Visualizzo il rapporto e confermo le modifiche. Customer cust; //Page1, read customer, updates City property using(MyDataContext db1 = newMyDataContext()) ...
Avevo già accennato al concetto di Object Identity in LINQ To SQl tempo fa, ultimamente, parlando di LINQ To SQL, mi diverto a mettere in crisi chi mi ascolta mostrando questo esempio:
//Read 'ALFKI' entry from Nothwind...
MyDataContext db = new MyDataContext();
Customer cust = db.Customers.Where(c => c.CustomerID == "ALFKI").Single<Customer>();
Console.WriteLine("ALFKI Customer's city is:" + cust.City);
//Updates ALFKI City to London
string query = "UPDATE Customers SET City={0} WHERE CustomerID={1}";
int ret = db.ExecuteCommand(query, "London", "ALFKI");
Console.WriteLine("{0} record updated", ret);
//Queries all customers living in London...
Console.WriteLine("Geting customers in London...");
IQueryable<Customer> custInBerlin = db.Customers.Where(c => c.City == "London");
foreach (Customer c in custInBerlin)
{
Console.WriteLine("{0} lives in {1}",c.CustomerID, c.City);
}
L'output...
A quanto pare LINQ To SQL, almeno nella beta2, non ama molto il databinding.Prediamo un esempio banale: mostrare il contenuto della tabella Customers di Northwind e aggiungere un nuovo cliente.Supponendo di avere già creato attraverso il designer di Visual Studio 2008 le varie entities il codice da scrivere è: 1: NwDataContext nw = new NwDataContext(@"Data Source=VMXP\SQLEXPRESS;Initial Catalog=Northwind"); 2: 3: public Form1 () 4: { 5: InitializeComponent(); 6: ...
INotifyPropertyChanged è ormai di casa per chi usa databinding sopratutto per chi lo fa con WPF, con LINQ è in arrivo un altra interfaccia denominata INotifyPropertyChanging.
Mentre la prima ha lo scopo di informare il motore di binding che una determinata proprietà è stata modificata e che quindi l'eventuale controllo ad essa bindato deve essere aggiornato, la seconda serve per ottimizzare il meccanismo di change tracking implementato da LINQ per determinare se un entità è stata modificata e quindi inviare il comando SQL di aggiornamento quando invochiamo DataContext.SubmitChanges().
In assenza di questa interfaccia quando recuperiamo delle entities via DataContext come nell'esempio che segue:
...