Per chi si avvicina a LINQ, consiglio di stare attenti alla seguente frase (fonte):

L'esecuzione della query è distinta dalla creazione della query. La creazione della query definisce la query, mentre l'esecuzione viene attivata da un meccanismo diverso. Una query può essere eseguita appena definita (esecuzione immediata) oppure è possibile archiviare la definizione ed eseguire la query in un secondo momento (esecuzione posticipata).

Lo sanno anche i muri, ma fra il sapere e ricordarselo (o accorgersene), ce ne corre :)
Detto questo, cosa ci aspetteremmo dal seguente blocco di codice (vetusto, lo so, ma spero sia chiaro)?
Riformulo meglio la domanda: cosa conterrà il repeater?

var sectionId = 10;
var posts = from a in myDataContext.Articles
where a.SectionId == sectionId
select new Article { Id = a.Id, Title = a.Title };
myRepeater.DataSource = posts;

sectionId = 20;
var title = (from a in myDataContext.Articles
where a.SectionId == sectionId
select a.Title).First();
myLabel.Text = title;

this.DataBind();

La risposta è facile, e ovviamente non si vince nulla :)

Per forzare l’esecuzione immediata, si potrebbe ricorrere ai metodi ToList() o ToArray() o gli n-altri. Ovviamente si perderebbe uno dei maggiori vantaggi di LINQ:

Se la query non contiene un metodo che causa l'esecuzione immediata, l'esecuzione effettiva della query viene posticipata fino a quando non si esegue un'iterazione della variabile di query in un ciclo foreach (ad esempio). L'esecuzione posticipata consente di combinare più query o di estendere una query. Una query estesa viene modificata in modo da includere nuove operazioni. Le modifiche vengono quindi applicate all'eventuale esecuzione.

hth,
a.

Technorati Tag: ,