Недавно я столкнулся с вопросом на форуме 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" ответ исходному потоку не является допустимым обходным путем)
Обновление: добавлено вознаграждение в размере 500 пунктов. Развлекайся.
Обновление: как упоминалось выше, решение, использующее EFv4 / .net 4 (β1 или новее), конечно, имеет право на вознаграждение. Если вы используете .net 4 post β1, укажите номер сборки (например, 4.0.20605), используемый вами запрос L2E и SQL, который он сгенерировал и отправил в БД.
Обновление: эта проблема была исправлена в VS2010 / .net 4 beta 2. Хотя сгенерированный SQL по-прежнему имеет несколько [относительно безобидных] дополнительных уровней вложенности, он не делает ничего лишнего. вещи, к которым он привык. Окончательный план выполнения после того, как оптимизатор SQL Server опробовал его, теперь настолько хорош, насколько это возможно. +++ для парней и парней, ответственных за часть EFv4, генерирующую SQL ...