Мой опыт работы с Linq-to-Sql заключается в том, что он не является сверхпроизводительным, когда вы начинаете входить в сложные объекты и / или объединения.
Первый шаг - настроить LoadOptions для текста данных.Это приведет к принудительному объединению, чтобы отозвать полную запись.Это была проблема в системе отслеживания билетов, которую я написал.Я отображал список из 10 билетов и увидел, что по сети поступило около 70 запросов.У меня был тикет-> субстрат-> статус.Из-за ленивой инициализации L2S каждый внешний ключ для каждого объекта, на который я ссылался в сетке, вызывал новый запрос.Вот сообщение в блоге (не мое) на эту тему (MSDN был слабым): http://oakleafblog.blogspot.com/2007/08/linq-to-sql-query-execution-with.html
Следующий вариант - создать предварительно скомпилированные запросы Linq.Я должен был сделать это с большими соединениями.Вот еще одна запись в блоге на эту тему: http://aspguy.wordpress.com/2008/08/15/speed-up-linq-to-sql-with-compiled-linq-queries/
Следующий вариант - преобразовать вещи в хранимые процедуры.Это наверняка усложняет программирование и развертывание, но для сложных запросов, когда вам нужен только поднабор данных, они будут на несколько порядков быстрее.
Причина, по которой я это поднимаю, заключается в том, что вы говоритео кешировании вещей (почему бы не использовать встроенный Cache в ASP.NET?) может вызвать у вас много головной боли в долгосрочной перспективе.Я бы порекомендовал собрать вашу систему и затем запустить трассировку SQL, чтобы увидеть, где проблемы с производительностью вашей базы данных, а затем построить оптимизацию вокруг этого.Вы можете обнаружить, что ваши реальные проблемы не в «топ-10 тем», а в других, гораздо более простых для устранения областях.