Utilizzare il Lazy Load per caricare una proprietà semplice con LINQ to SQL

di Ugo Lattanzi, in LINQ,

In LINQ to SQL tutte le EntityRef ed gli EntitySet vengono caricati per default in Lazy Load. Tuttavia, in alcuni contesti può essere utile caricare in lazy anche dei tipi primitivi.

Si provi ad immaginare una classe User in cui si ha un campo Description, di tipo stringa, che nella maggior parte dei casi non si ha la necessità di visualizzare. La cosa migliore, è caricare questa proprietà soltanto al momento del suo reale utilizzo e non ogni volta che viene recuperata l'oggetto User.

Per far ciò, ci viene in aiuto la classe System.Data.Linq.Link<T>, dove T quò essere qualsiasi tipo.

Il mapping seguente mostra come caricare dinamicamente la proprietà Description.

[Serializable,Table(Name = "dbo.LinqLazy")]
public class User
{
  [Column(AutoSync = AutoSync.OnInsert, DbType = "Int NOT NULL IDENTITY",
    IsPrimaryKey = true, IsDbGenerated = true)]
  public int ID { get; set; }

  [Column(DbType = "NVarChar(50) NOT NULL", CanBeNull = false)]
  public string Username { get; set; }

  [Column(DbType = "NVarChar(150) NOT NULL", CanBeNull = false)]
  public string Email { get; set; }

  private System.Data.Linq.Link<string> _Description;

  [Column(Storage = "_Description", DbType = "NVarChar(MAX) NOT NULL", 
    CanBeNull = false)]
  public string Description
  {
    get { return this._Description.Value; }
    set { this._Description.Value = value; }
  }
}

Il caricamento del dato lo effettua il DataContext tramite reflection sulla proprietà _Description e non tramite la proprietà pubblica Description. In questo modo, si evita l'invocazione dei metodi NotifyPropertyChanging e NotifyPropertyChanged normalmente inseriti tramite il wizard di creazione del mapping presente in Visual Studio 2008.

Il seguente codice scatena un errore a runtime di tipo VerificationException con il messaggio "Operation could destabilize the runtime.".

[Column(DbType = "NVarChar(MAX) NOT NULL", CanBeNull = false)]
public System.Data.Linq.Link<string> Description { get; set; }

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti

I più letti di oggi