DarioSantarelli.Blog("UgiDotNet");

<sharing mode=”On” users=”*” />
posts - 176, comments - 105, trackbacks - 3

My Links

News


This is my personal blog. These postings are provided "AS IS" with no warranties, and confer no rights.




Tag Cloud

Archives

Post Categories

My English Blog

LinqDataSource e LINQ to SQL: Select, Insert, Update, Delete

Ci sono diversi dettagli a cui dobbiamo fare attenzione quando utilizziamo il behaviour di default del controllo LinqDataSource per quanto riguarda le classiche operazioni di Select, Insert, Update, Delete verso un model layer basato su un mapping con tabelle di un database. Infatti, se da una parte questo nuovo controllo rende ancora più immediato ed intuitivo l'accesso al modello dei dati, dall'altra rischia di autogenerare statement SQL spesso non accettabili da un punto di vista di performance, o comunque non sufficientemente ottimizzati per i nostri fini. Riporto quindi alcuni "fatti" da tener presente quando si sfruttano i meccanismi di autogenerazione di query SQL tramite LinqDataSource:

  • (Ovvio) Qualora non specifichiamo esplicitamente la proprietà Select, vengono estratte tutte le proprietà (o Data Columns se vogliamo) del nostro data object corrispondente al TableName specificato (Tabella Customers nell'esempio).


    <
    asp:LinqDataSource ID="MyLinqDataSource" runat="server"
                       
    ContextTypeName="MyDataContext" TableName="Customers"      
    </asp:LinqDataSource>


    In pratica, in questi casi lo statement SQL autogenerato interesserà tutti i campi oggetto di un mapping diretto sulla tabella Customers del DB.

  • La proprietà Select permette di reperire un sottoinsieme di proprietà del nostro data object, il che significa applicare una projection a runtime su un nuovo Anonymous Type 'bindabile' ad un controllo di presentazione dati (es. ListView). Ad esempio,

    <asp:LinqDataSource ... Select="new(ID,FirstName,LN as LastName)" TableName="Customers" ... </asp:LinqDataSource>

    potrebbe risultare molto più consigliabile dal momento che rispecchia la buona prassi di estrarre dalla nostra sorgente dati solo e soltanto i campi necessari, evitando dunque costi computazionali inutili da parte dello statement SQL autogenerato, che in questo particolare esempio interrogherà soltanto i campi ID,FirstName e LN della tabella Customers oggetto del mapping
  • La combinazione delle proprietà Select e GroupBy permette di raggruppare ed aggregare dati su una o più colonne, facendoci poi perdere la possibilità di effettuare insert, update e delete sui dati che stiamo visualizzando
  • Per abilitare la modifica automatica dei dati dobbiamo impostare a true almeno una delle proprietà EnableUpdate/EnableInsert/EnableDelete (di default impostate a false), ma ciò ci vincola a non impostare la proprietà Select (pena Exception). In questo modo però lo statement SQL autogenerato interrogherà tutti i campi della tabella in mapping con il data object (che verranno memorizzati nel ViewState). Ad esempio, nel caso dell'Update di un record, lo statement SQL autogenerato dal nostro LinqDataSource includerà nella clausola SET solo i campi che hanno subito una variazione reale, mentre nella clausola WHERE tutti i confronti sui campi con i valori precedenti alla modifica.
  • Negli scenari di insert/update/delete automatica dei record dobbiamo aver cura di fornire l'opportuna interfaccia utente che si occupi tra l'altro della visualizzazione dei campi di interesse:  ad esempio, in un GridView associato ad un LinqDataSource con EnableUpdate/EnableInsert/EnableDelete = "true" (quindi privo di Select/GroupBy) potremmo impostare AutoGenerateColumns="false" e dichiarare esplicitamente le Column da renderizzare.


Technorati tags:  LinqDataSource ,  Linq

Print | posted on mercoledì 30 gennaio 2008 02:14 | Filed Under [ ASP.NET 3.5 ]

Comments have been closed on this topic.

Powered by:
Powered By Subtext Powered By ASP.NET