Стоит отметить, что Entity Framework имеет (как минимум) три способа потребления:
- LINQ для сущностей через объектные сервисы через Entity Client
- Entity SQL поверх объектных служб поверх Entity Client
- Entity SQL с использованием объектов команд Entity Client (наиболее похожих на классический ADO.NET)
Entity Client, в конечном итоге, выдает представление команды ESQL (в канонической, независимой от базы данных форме), которую поставщик ADO.NET для конкретной СУБД отвечает за преобразование в специфичный для хранилища SQL. Это правильная модель IMHO, так как на протяжении многих лет много времени было потрачено (и будет инвестироваться и впредь) в создание отличных провайдеров ADO.NET для каждого магазина.
Поскольку Entity Framework необходимо работать со многими магазинами и, следовательно, со многими поставщиками ADO.NET, у них меньше возможностей для простой оптимизации того, что Entity Client генерирует для каждого магазина (по крайней мере - там, где мы находимся с v1). Группе LINQ to SQL пришлось решить гораздо меньшую проблему - «работает только с SQL Server», и, следовательно, она могла легче хранить определенные вещи. Я знаю, что команда EF знает, что есть случаи, когда EF to SQL Server производит TSQL менее эффективно, чем L2S, и работаем над улучшением этого для V2.
Интересно, что эта модель позволяет добавлять новые возможности между Entity Client и ADO.NET Provider для магазина. Эти «провайдеры упаковки» могут добавлять такие сервисы, как ведение журнала, аудит, безопасность, кэширование. Это обсуждается как функция V2 на http://blogs.msdn.com/efdesign/archive/2008/07/09/transparent-caching-support-in-the-entity-framework.aspx
Если вы посмотрите на более широкую картину, вы увидите, что было бы ужасно сложно и действительно ограничительно пытаться каким-то образом преобразовать поколение L2S TSQL в архитектуру Entity Framework.