■Linqの実行タイミング
Linqは遅延実行されます、メソッドの行を通ったタイミングではなくIEnumerable<T>オブジェクト以外の結果が必要になった時に実行されます。
たとえば、以下のようなデータベースやストレージにアクセスするコードを書いたとします。
var hogeList = Db.HogeTable.Where(x => x.Code == code);

foreach(var h in hogeList)
{
    Console.WriteLine(h.Name);
}

負荷軽減
↓↓↓↓↓↓↓↓

// LINQのデータを一度リストに展開することで、遅延実行を回避する。
var hogeList = Db.HogeTable.Where(x => x.Code == code).ToList().AsQueryable();

foreach(var h in hogeList)
{
    Console.WriteLine(h.Name);
}

ぱっと見、1回のアクセスを行っているように見えますが、ループの回数分アクセスが行われます。メモリ内のコレクションに対するアクセスであればそれほどパフォーマンスに差が出ませんが、外部ストレージ(SQL Azure/Table Storage)へのアクセスの場合一気にパフォーマンスが劣化します。自分が一番ハマったのもこのパターンです。アクセスを1回に抑えるためには、Whereメソッドの後にToListやToArrayなどで、データの型を確定させる必要があります。

Linqの細かいことはこちらの@ITの記事を参考にしてください。
LINQの仕組み&遅延評価の正しい基礎知識
http://www.atmarkit.co.jp/fdotnet/chushin/greatblogentry_06/greatblogentry_06_01.html