Использование Include в Entity Framework 4 с лямбда-выражениями

88

Я видел много статей о том, как решить эту проблему, все они связаны с CTP4 или добавлением моих собственных методов расширения.

Существует ли «официальный» способ использования лямбда-выражений внутри include (как для отношений первого уровня, так и для 2-го и более уровней), включенный в EF4, или он в конечном итоге не был включен в RTM?

Он есть - я был бы рад узнать, как это сделать, поскольку использование лямбда-выражения в моем коде сейчас (с # system.data.entity # system.data.linq) все еще дает мне:

Невозможно преобразовать лямбда-выражение в тип 'string', потому что это не тип делегата для:

var customers = from c in
context.Customers.Include(c=>c.Phone)
Дэни
источник
1
нет, не существует (кроме CTP4 - как вы говорите). Я использую методы / перечисления расширений для обеспечения безопасности типов.
RPM1984,
Я тоже это сделал, поэтому MS включила его в CTP4 и удалила в RTM?
Дэни

Ответы:

229

RTM-версия Entity Framework 4.1 фактически включает в себя методы расширения в EntityFramework.dllфайле для быстрой загрузки с помощью лямбда через Includeфункцию. Просто включите DLL в свой проект, и вы сможете писать такой код, как:

var princesses1 = context.Princesses.Include(p => p.Unicorns).ToList();

Не забудьте добавить оператор Import / Using, чтобы включить пространство имен System.Data.Entity . В противном случае компилятор не сможет найти методы расширения. Например:

using System.Data.Entity;

См. Эту статью блога группы разработчиков ADO.NET для получения дополнительной информации.

Cecilphillip
источник
1
Хотя ссылка на блог ADO.net по-прежнему актуальна, справочник / руководство EF6 по той же теме: Загрузка связанных объектов Я думаю, что в документации нужно переключиться на примеры Princess и Unicorn вместо Blog и Post, которые они использовали везде.
Arkaine55
1
спасибо, я просто добавил using System.Data.Entity; это работа меня.
Аднан
ссылка на блог команды мертва, это новое место
Nintynuts
89

Хотя это подразумевается в вопросе, для всех, у кого такая же проблема, когда они не могут использовать лямбды с .Include, убедитесь, что у вас есть это:

using System.Data.Entity;
AaronLS
источник
5

Нет, на данный момент официальная поддержка Include с лямбда-выражением в RTM отсутствует. Я использую это .

Когда мы говорим о CTP4, мы имеем в виду Entity Framework Feature. Это более новый API, чем EF4. В основном он включает Code First и несколько других улучшений.

Ладислав Мрнка
источник
Есть идеи, когда MS будет поддерживать эту функцию? Я понимаю, что все эти методы расширения имеют проблемы с производительностью с большим / многоуровневым объектом - поскольку им нужно снова и снова проходить каждый вызов для включения, и хотя дерево «определения» объекта является постоянным и может быть кэшировано, такого решения, как этого пока нет.
Дэни
Entity Framework Feature в настоящее время находится в CTP5. Думаю, RTM-версия должна быть выпущена в первом квартале 2011 года. Надеюсь, она будет содержать Include с лямбда-выражением, но я еще не проверял ее реализацию, поэтому не могу сказать, использует ли она какое-либо кеширование.
Ладислав Мрнка
31
Этот ответ неверен для EF 4.3.x. Другие ответы верны , нужно использовать System.Data.Entity, чтобы получить перегрузку с помощью lamda-выражений.
Эрик Дж
1
@EricJ: Да. Строго типизированный Include доступен с EF 4.1.
Ладислав Мрнка