Использовать стоит однозначно, но благоразумно. Все сильно зависит от задачи но:
- если связанные данные точно понадобятся то можно загрузить одним запросом (см. .Include(...));
- при ленивой загрузке запрос будет _только_ при обращении к свойству, но если не воспользовались include то это в любом случае запрос;
- вероятно речь о code first, не забываем про индексы (fluent api)
- если все стало плохо то всегда можно воспользоваться видами (в том числе материализованными) или прямыми запросами
Я думаю вполне может дать фору по следующим показателям:
- удобство и скорость разработки;
- JIT компиляция лучше интерпретации, а с скоро будет компиляция в нативный код.
Обычно ASP.NET stateless поэтому создавать свой контекст на каждый запрос это правильно. Вариант создавать контекст в action имеет право на жизнь, но мне больше нравиться так:
public class RequestsController : Controller
{
/// <summary>
/// Application DB context
/// </summary>
protected ApplicationDbContext db = new ApplicationDbContext();