<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Linq</title>
        <link>http://blogs.ugidotnet.org/janky/category/Linq.aspx</link>
        <description>Linq</description>
        <language>it-IT</language>
        <copyright>Giancarlo Sudano</copyright>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>Linq to SQL NON &amp;egrave; un Active Record...</title>
            <link>http://blogs.ugidotnet.org/janky/archive/2007/11/26/linq-to-sql-non-egrave-un-active-record.aspx</link>
            <description>&lt;p&gt;Negli ultimi giorni chissà quante volte l'ho letto, mo' mi sono stancato...:-)&lt;/p&gt;
&lt;p&gt;Ripeto: &lt;br /&gt;
&lt;em&gt;Linq to SQL non è un Active Record.&lt;/em&gt; &lt;br /&gt;
&lt;em&gt;Linq to SQL è un ORM puro.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;da &lt;a href="http://martinfowler.com/eaaCatalog/activeRecord.html"&gt;Fowler&lt;/a&gt;: &lt;br /&gt;
"An object carries both data and behavior. Much of this data is persistent and needs to be stored in a database. Active Record uses the most obvious approach, putting data access logic in the domain object. This way all people know how to read and write their data to and from the database" &lt;br /&gt;
&lt;em&gt;&lt;img id="id" alt="" src="http://martinfowler.com/eaaCatalog/activeRecordSketch.gif" /&gt; &lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;E ora veniamo a noi, ecco qualche concetto takeaway da memorizzare e studiare a casa:&lt;/p&gt;
&lt;p&gt;1. &lt;strong&gt;L'Active Record&lt;/strong&gt; definisce che la &lt;strong&gt;responsabilità&lt;/strong&gt; del ciclo di vita di una entity è sulla entity stessa. In &lt;strong&gt;Linq to SQL&lt;/strong&gt; la responsabilità è delegata al &lt;strong&gt;DataContext&lt;/strong&gt; (come in un qualsiasi ORM che si rispetti). Nella implementazione di Caste.ActiveRecord infatti, tutte le entity derivano da una base comune che ha i metodi .Save(), .Insert(), etc. etc.&lt;/p&gt;
&lt;p&gt;2. L'&lt;strong&gt;Active Record&lt;/strong&gt; prevede che la struttura della classe che rappresenta la entity sia più o meno simile alla struttura del record sul db (e da dove verrebbe il nome allora?). In Linq to SQL ci si può scostare &lt;strong&gt;enormemente&lt;/strong&gt;, riusciendo a mappare tranquillamente la &lt;strong&gt;many-to-one&lt;/strong&gt; e il &lt;strong&gt;l'ereditarietà&lt;/strong&gt; (non è possibile avere per adesso Composizioni di oggetti mappati, aka &lt;strong&gt;Component&lt;/strong&gt; per i NHibernettiani)&lt;/p&gt;
&lt;p&gt;3. Linq to SQL ha un &lt;strong&gt;wizard&lt;/strong&gt; che parte dalla struttura del DB. Questo non lo fa di certo un Active Record. Al massimo si può dire che il wizard è (giusto un po...:-)) &lt;strong&gt;datacentrico&lt;/strong&gt;. Ma (come ho già dimostrato ampiamente ai community days) con Linq to SQL si può partire dalla classe entity e mappare o con attributi o con file XML.&lt;/p&gt;
&lt;p&gt;Quindi: &lt;br /&gt;
&lt;strong&gt;mancanza di mapping 1 a 1 con la tabella... &lt;br /&gt;
responsabilità delle CRUD operation non sulla entity, bensì sul contesto di persistenza.... &lt;br /&gt;
stop così.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;&lt;br /&gt;
ps: Se poi da li passasse il buon &lt;a href="http://blogs.ugidotnet.org/raffaele"&gt;Raf&lt;/a&gt;, vi direbbe che Linq to SQL è uno strumento per costruire DAL... &lt;br /&gt;
Ok Raf non siamo in disaccordo...ogni ORM serve a scrivere i DAL....va bene così? :-)&lt;/em&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/janky/aggbug/89933.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Giancarlo Sudano</dc:creator>
            <guid>http://blogs.ugidotnet.org/janky/archive/2007/11/26/linq-to-sql-non-egrave-un-active-record.aspx</guid>
            <pubDate>Mon, 26 Nov 2007 14:21:49 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/janky/archive/2007/11/26/linq-to-sql-non-egrave-un-active-record.aspx#feedback</comments>
            <slash:comments>4</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/janky/comments/commentRss/89933.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/janky/services/trackbacks/89933.aspx</trackback:ping>
        </item>
        <item>
            <title>Confronto: NHibernate - Linq 2 SQL - Entity Framework</title>
            <link>http://blogs.ugidotnet.org/janky/archive/2007/08/27/87979.aspx</link>
            <description>Mi è stato chiesto molte volte, anche su Guisa esiste un bel &lt;a href="http://www.guisa.org/forums/thread/1241.aspx"&gt;thread&lt;/a&gt; sul confronto di questi tre &lt;span style="font-weight: bold;"&gt;ORM&lt;/span&gt;, quindi ne ho approfittato per fare una matrice che incrocia le feature di questi tre prodotti. Ahime non ho ancora qualche informazione su &lt;span style="font-weight: bold;"&gt;Entity Framework&lt;/span&gt; e consideranto che quest'ultimo è ancora in CTP,la sua colonna potrebbe essere passibile di modifiche.&lt;br /&gt;
Ho usato il simbolo "??" nelle feature di cui non ho ancora conoscenza.&lt;br /&gt;
Siete invitati a propormi qualche eventuale feature su sui trovare i confronti, terrò aggiornata la tabella.&lt;br /&gt;
&lt;table cellspacing="0" cellpadding="0" border="1"&gt;
    &lt;tbody&gt;
        &lt;tr&gt;
            &lt;td&gt;             &lt;/td&gt;
            &lt;td&gt;                 &lt;strong&gt;                 NHibernate&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;                 &lt;strong&gt;Linq to SQL&lt;/strong&gt;&lt;/td&gt;
            &lt;td&gt;                 &lt;strong&gt;                 Entity Framework&lt;/strong&gt;&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Mapping con Attributi&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Mapping con XML&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Persistenza Trasparente&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Parziale.                 &lt;br /&gt;
            Per la gestione delle collezioni e dei proxy bisogna usare dei tipi specifici&lt;/td&gt;
            &lt;td&gt;                 Parziale allo stato attuale. Le entity devono implementare una interfaccia&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Persistenza Transitiva&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 No&lt;/td&gt;
            &lt;td&gt;                 No&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Strategie di Fetching&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Strategie di Ereditarietà&lt;/td&gt;
            &lt;td&gt;                 Tutte le strategie&lt;/td&gt;
            &lt;td&gt;                 Solo la Table per Hierarchy&lt;/td&gt;
            &lt;td&gt;                 Tutte le strategie&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Mapping Entity su più tabelle&lt;/td&gt;
            &lt;td&gt;                 Previsto il porting da Hib 3.2&lt;/td&gt;
            &lt;td&gt;                 No&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Mapping di Value Type&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 No&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Linguaggio di interrogazione a oggetti&lt;/td&gt;
            &lt;td&gt;                 HQL (stringhe)&lt;/td&gt;
            &lt;td&gt;                 Linq applicato a DataContext&lt;/td&gt;
            &lt;td&gt;                 Linq to Entities (applicato a ObjectContext) per c# e vb.net.&lt;br /&gt;
            eSQL (stringhe) per tutti i linguaggi.&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Lazy load&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Mapping di chiavi composite&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Multi-database vendor&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 No&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Tracking stato entity&lt;/td&gt;
            &lt;td&gt;                 Contesto di Persistenza.&lt;/td&gt;
            &lt;td&gt;                 Contesto di Persistenza o Entity&lt;/td&gt;
            &lt;td&gt;                 ??&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Identity Map&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Caching di entity e query&lt;/td&gt;
            &lt;td&gt;                 Si&lt;/td&gt;
            &lt;td&gt;                 No&lt;/td&gt;
            &lt;td&gt;                 ??&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Estendibilità&lt;/td&gt;
            &lt;td&gt;                 Molto granulare. Architettura a plug-in in molte parti.&lt;/td&gt;
            &lt;td&gt;                 Poco granulare. IQuerableProvider è molto complesso.&lt;/td&gt;
            &lt;td&gt;                 ??&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Disponibilià&lt;/td&gt;
            &lt;td&gt;                 Immediata&lt;/td&gt;
            &lt;td&gt;                 Da novembre in poi&lt;/td&gt;
            &lt;td&gt;                 da metà del 2008 in poi&lt;/td&gt;
        &lt;/tr&gt;
        &lt;tr&gt;
            &lt;td&gt;                 Supporto a pagamento&lt;/td&gt;
            &lt;td&gt;                 Red Hat&lt;/td&gt;
            &lt;td&gt;                 Microsoft&lt;/td&gt;
            &lt;td&gt;                 Microsoft&lt;/td&gt;
        &lt;/tr&gt;
    &lt;/tbody&gt;
&lt;/table&gt;
&lt;br /&gt;
Nota: &lt;br /&gt;
Si!...sono tutti e tre degli ORM...con feature più o meno evolute...ma la sostanza è quella.&lt;img src="http://blogs.ugidotnet.org/janky/aggbug/87979.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Giancarlo Sudano</dc:creator>
            <guid>http://blogs.ugidotnet.org/janky/archive/2007/08/27/87979.aspx</guid>
            <pubDate>Mon, 27 Aug 2007 23:35:51 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/janky/archive/2007/08/27/87979.aspx#feedback</comments>
            <slash:comments>9</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/janky/comments/commentRss/87979.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/janky/services/trackbacks/87979.aspx</trackback:ping>
        </item>
        <item>
            <title>Risorse su Linq to SQL</title>
            <link>http://blogs.ugidotnet.org/janky/archive/2007/08/27/87969.aspx</link>
            <description>Ok, si riprende.&lt;br /&gt;
&lt;br /&gt;
Giusto per scaldare i motori, (visto che ho in previsione di scrivere qualcosa sull'uso di &lt;span style="font-weight: bold;"&gt;Linq to SQL&lt;/span&gt;, sia da un punto di vista architetturale che puramente implementativo) vi segnalo i link più interessanti sull'argomento.&lt;br /&gt;
Sottolineo che si tratta di &lt;span style="font-weight: bold;"&gt;Linq to SQL&lt;/span&gt;, qundi dell'&lt;span style="font-weight: bold;"&gt;ORM&lt;/span&gt; di casa Microsoft e non di &lt;span style="font-weight: bold;"&gt;Linq&lt;/span&gt; in generale:&lt;br /&gt;
&lt;br /&gt;
Ovviamente gli articoli di &lt;a href="http://weblogs.asp.net/scottgu"&gt;ScottGu&lt;/a&gt; non potevano mancare, coprono molto bene quasi tutte le feature:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://weblogs.asp.net/scottgu/archive/2007/05/19/using-linq-to-sql-part-1.aspx"&gt;Part 1: Introduction to LINQ to SQL&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://weblogs.asp.net/scottgu/archive/2007/05/29/linq-to-sql-part-2-defining-our-data-model-classes.aspx"&gt;Part 2: Defining our Data Model Classes&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://weblogs.asp.net/scottgu/archive/2007/06/29/linq-to-sql-part-3-querying-our-database.aspx"&gt;Part 3: Querying our Database&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://weblogs.asp.net/scottgu/archive/2007/07/11/linq-to-sql-part-4-updating-our-database.aspx"&gt;Part 4: Updating our Database&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://weblogs.asp.net/scottgu/archive/2007/07/16/linq-to-sql-part-5-binding-ui-using-the-asp-linqdatasource-control.aspx"&gt;Part 5: Binding UI using the ASP:LinqDataSource Control&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://weblogs.asp.net/scottgu/archive/2007/08/16/linq-to-sql-part-6-retrieving-data-using-stored-procedures.aspx"&gt;Part 6: Retrieving Data Using Stored Procedures&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2007/08/23/linq-to-sql-part-7-updating-our-database-using-stored-procedures.aspx"&gt;Part 7:  Updating our Database using Stored Procedures&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;
E se ne prevedono altri.&lt;br /&gt;
&lt;br /&gt;
E poi è un piacere leggere &lt;a href="http://blogs.msdn.com/ricom"&gt;Rico Mariani&lt;/a&gt;, uno dei "pezzi grossi" del framework su questa serie totalmente dedicata alle prestazioni:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/ricom/archive/2007/06/22/dlinq-linq-to-sql-performance-part-1.aspx"&gt;Linq to SQL Performance - Part 1&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/ricom/archive/2007/06/25/dlinq-linq-to-sql-performance-part-2.aspx"&gt;Linq to SQL Performance - Part 2&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/ricom/archive/2007/06/29/dlinq-linq-to-sql-performance-part-3.aspx"&gt;Linq to SQL Performance - Part 3&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/ricom/archive/2007/07/05/dlinq-linq-to-sql-performance-part-4.aspx"&gt;Linq to SQL Performance - Part 4&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/ricom/archive/2007/07/16/dlinq-linq-to-sql-performance-part-5.aspx"&gt;Linq to SQL Performance - Part 5&lt;/a&gt;  &lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
E poi ancora Matt sulla costruzione di un provider interrogabile, che sarà la parte probabilmente più tosta:&lt;br /&gt;
&lt;ul&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/mattwar/archive/2007/07/30/linq-building-an-iqueryable-provider-part-i.aspx"&gt;Building an IQueryable Provider - Part 1&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/mattwar/archive/2007/07/31/linq-building-an-iqueryable-provider-part-ii.aspx"&gt;Building an IQueryable Provider - Part 2&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/mattwar/archive/2007/08/01/linq-building-an-iqueryable-provider-part-iii.aspx"&gt;Building an IQueryable Provider - Part 3&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/mattwar/archive/2007/08/02/linq-building-an-iqueryable-provider-part-iv.aspx"&gt;Building an IQueryable Provider - Part 4&lt;/a&gt;  &lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/mattwar/archive/2007/08/03/linq-building-an-iqueryable-provider-part-v.aspx"&gt;Building an IQueryable Provider - Part 5&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a target="_blank" href="http://blogs.msdn.com/mattwar/archive/2007/08/09/linq-building-an-iqueryable-provider-part-vi.aspx"&gt;Building an IQueryable Provider - Part 6&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;br /&gt;
Tecnicamente sono ottimi link, ma si sente fortemente la mancanza di &lt;span style="font-weight: bold;"&gt;linee guida&lt;/span&gt; su come utilizzare i &lt;span style="font-weight: bold;"&gt;contesti di persistenza&lt;/span&gt; di Linq 2 SQL, e quale impatto hanno sul disegno delle nostre applicazioni.&lt;br /&gt;
Pur trovando una montagna di risorse su come usare Linq to SQL in pochi snippet di codice, non si trova ancora niente su come "impiantarlo" in applicazioni real-world.&lt;br /&gt;
&lt;br /&gt;
Vedremo di farci un pensierino, giusto?&lt;img src="http://blogs.ugidotnet.org/janky/aggbug/87969.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Giancarlo Sudano</dc:creator>
            <guid>http://blogs.ugidotnet.org/janky/archive/2007/08/27/87969.aspx</guid>
            <pubDate>Mon, 27 Aug 2007 10:58:43 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/janky/archive/2007/08/27/87969.aspx#feedback</comments>
            <slash:comments>7</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/janky/comments/commentRss/87969.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/janky/services/trackbacks/87969.aspx</trackback:ping>
        </item>
    </channel>
</rss>