Posts
83
Comments
165
Trackbacks
11
January 2008 Blog Posts
[LINQ2SQL] Modalità di caricamento

Nell'ottica di sfruttare al meglio le potenzialità di un ORM in genere, e di LINQ2SQL in particolare (anche se a mio modesto parere è un "ibrido") bisogna, come da molte parti è già stato suggerito, "ricordarsi di non dimenticare" che sempre con un database relazionale abbiamo a che fare.
Questo preambolo per dire che il miglior suggerimento che si può dare a chi inizia ad utilizzare Linq2Sql è quello di non dimenticarsi MAI di abbinare l'utilizzo di un profiler per vedere cosa stiamo cercando di far fare al nostro db...

In un semplice esempio (il database di riferimento è il "famoso" AdventureWorks) possiamo notare come l'utilizzo fuori controllo di designer e strumenti RAD possono "deviare" dal corretto/miglior utilizzo delle tecnologie che abbiamo a disposizione:

 

Di default il caricamento definito nel DataContext è un "caricamento tardivo", quindi nell'esempio di codice seguente il caricamento degli indirizzi che soddisfano il criterio impostato viene scatenato nel momento in cui inizia l'iterazione sul risultato, all'interno del ciclo foreach.
La selezione del nome dello stato (o della provincia) associata all'indirizzo corrente scatena, ad ogni ciclo nuovi round-trip sul database, se l'oggetto StateProvince non è ancora stato caricato (non presente nel DataContext).

E il risultato del profiler è impietoso...

Questo semplice caso è lampante e mette in evidenza come, senza conoscere la modalità con cui Linq2Sql "mappa" le nostre query, rischiamo veramente di mettere sotto-stress il database, facendolo lavorare nel modo a lui meno congeniale.

Per un corretto caricamento (in questo caso), bisogna istruire il DataContext affinchè i round-trip sul database siano limitati e quindi le n-select precedenti siano effettivamente un'unica richiesta sulle tabelle degli indirizzi e degli stati legate tramite una join.

Così facendo il risultato la query creata da Linq2Sql, diciamo così, mi piace di più:

exec sp_executesql N'SELECT
[t0].[AddressID],
...
[t1].[StateProvinceID]
...
FROM [Person].[Address] AS [t0] INNER JOIN [Person].[StateProvince] AS [t1] ON [t1].[StateProvinceID] = [t0].[StateProvinceID]
WHERE [t0].[City] LIKE @p0',N'@p0 nvarchar(2)',@p0=N'A%'

posted @ Monday, January 28, 2008 9:34 AM | Feedback (1)
[WinForm] Rendere trasparente un controllo

Esistono due tipologie di trasparenza per il background di un controllo:

  • Il controllo è reso trasparente per rendere visibile la form sottostante.
    Per ottenere questo risultato basta semplicemente impostare il valore della property BackColor del controllo a Color.Transparent, come nell'esempio seguente:

 

  • Il controllo è reso trasparente in modo da rendere visibile il desktop sottostante.
    Per ottenere questo risultato, bisogna impostare la property TransparencyKey della form che contiene il controllo e la proprietà BackColor del controllo stesso, al medesimo valore, come nell'esempio seguente:

posted @ Friday, January 25, 2008 2:16 AM | Feedback (0)
[WinForm] RichTextBox & AllowDrop

Questa sera, implementando la funzione di Drag&Drop verso un oggetto di tipo RichTextBox, mi sono accorto di una strana scelta di "design" relativa a questo oggetto.
La proprietà AllowDrop (e così anche gli eventi DragEnter e DragDrop), derivata dalla classe base Control, oltre a essere ridefinita (e fin qui, "poco male") è anche "marchiata" come Browsable = false, rendendola invisibile a design-time nella finestra delle proprietà.

Certo, non è un gran problema...è possibile nel costruttore della Form, piuttosto che nell'evento Load, impostare il tutto molto semplicemente nel modo seguente:

...ma questa proprio non l'ho capita!

Alla prossima
-melkio-

posted @ Monday, January 21, 2008 10:54 AM | Feedback (0)