Недавно я столкнулся с вопросом на форуме Entity Framework на msdn:
http://social.msdn.microsoft.com/Forums/en-US/adodotnetentityframework/thread/bb72fae4-0709-48f2-8f85-31d0b6a85f68
Человек, который задал вопрос, попытался сделать относительно простой запрос, включающий две таблицы: группирование, упорядочение по и агрегирование с использованием Linq-to-Entities. Довольно простой запрос Linq, а также простой в SQL - то, что люди пытаются делать каждый день.
Однако при использовании Linq-to-Entities результатом является сложный запрос с множеством ненужных объединений и т. Д. Я попробовал его и не смог получить Linq-to-Entities для генерации достойного SQL-запроса из него при использовании просто чистый Linq против сущностей EF.
Увидев значительную часть запросов монстров от EF, я подумал, что, возможно, OP (и я, и другие ) делают что-то не так. Может быть, есть лучший способ сделать это?
Итак, вот моя проблема: используя пример с форума EF и используя только Linq-to-Entities против двух сущностей, можно ли заставить EF генерировать запрос SQL без ненужных объединений и т. Д. сложности?
Мне бы хотелось, чтобы EF генерировал что-то немного более близкое к тому, что Linq-to-SQL делает для запросов того же типа, но все еще использовал Linq для модели EF.
Ограничения: используйте EFv1 .net 3.5 SP1 или EFv4 (бета-версия 1 является частью бета-версии VS2010 / .net4, доступной для загрузки от Microsoft). Не допускаются приемы отображения CSDL-> SSDL, «определяющие запросы» модели, хранимые процедуры, функции на стороне базы данных или представления. Простое отображение 1: 1 между моделью и БД и чистый запрос L2E, который выполняет то, что просил исходный поток в MSDN. Между этими двумя сущностями должна существовать связь (т. Е. Мой ответ «обходной путь № 1» на исходный поток не является допустимым обходным решением)
Обновление: Добавлена награда в 500pt. Веселитесь.
Обновление: Как уже упоминалось выше, решение, которое использует EFv4 / .net 4 (β1 или более позднюю версию), безусловно, имеет право на получение награды. Если вы используете .net 4 post β1, пожалуйста, укажите номер сборки (например, 4.0.20605), использованный вами запрос L2E и SQL, который он сгенерировал и отправил в БД.
Обновление: Эта проблема была исправлена в VS2010 / .net 4 beta 2. Хотя сгенерированный SQL все еще имеет несколько [относительно безопасных] дополнительных уровней вложенности, он не выполняет никаких сумасшедшие вещи, к которым он привык. Окончательный план выполнения после того, как оптимизатор SQL Server попытался это сделать, теперь настолько хорош, насколько это возможно. +++ для парней и парней, ответственных за генерирующую SQL часть EFv4 ...