Używanie Include in Entity Framework 4 z wyrażeniami lambda

88

Widziałem wiele artykułów o tym, jak rozwiązać tę sprawę, wszystkie związane z CTP4 lub dodaniem własnych metod rozszerzających.

Czy istnieje „oficjalny” sposób użycia wyrażeń lambda w EF4 wewnątrz include (zarówno dla relacji pierwszego poziomu, jak i drugiego i wyższego poziomu), czy też ostatecznie nie został uwzględniony w RTM?

Jest jeden - z przyjemnością się dowiem, jak to zrobić, ponieważ użycie wyrażenia lambda w moim kodzie teraz (z # system.data.entity # system.data.linq) nadal daje mi:

Nie można przekonwertować wyrażenia lambda na typ „ciąg”, ponieważ nie jest to typ delegata w:

var customers = from c in
context.Customers.Include(c=>c.Phone)
Dani
źródło
1
nie, nie istnieje (poza CTP4 - jak mówisz). Używam metod / wyliczeń rozszerzających, aby osiągnąć bezpieczeństwo typu.
RPM 1984,
Ja też to zrobiłem, więc MS umieścił to w CTP4 i usunął w RTM?
Dani

Odpowiedzi:

229

Wersja RTM Entity Framework 4.1 w rzeczywistości zawiera metody rozszerzające w EntityFramework.dllpliku, do szybkiego ładowania z lambdą za pośrednictwem Includefunkcji. Po prostu dołącz bibliotekę DLL do swojego projektu i powinieneś być w stanie napisać kod taki jak:

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

Pamiętaj, aby dodać instrukcję Import / Using w celu uwzględnienia przestrzeni nazw System.Data.Entity . W przeciwnym razie kompilator nie może znaleźć metod rozszerzających. Na przykład:

using System.Data.Entity;

Aby uzyskać więcej informacji, zobacz ten artykuł w blogu zespołu ADO.NET .

cecilphillip
źródło
1
Chociaż odsyłacz do bloga ADO.net jest nadal aktualny, odnośnik / przewodnik dotyczący EF6 na ten sam temat to: Ładowanie powiązanych jednostek Myślę, że dokumentacja musi zostać przełączona na przykłady Księżniczek i Jednorożców zamiast na Blog i Post, z których korzystali wszędzie.
Arkaine55
1
dzięki, po prostu dodaję za pomocą System.Data.Entity; jego praca mnie.
adnan
Link do bloga zespołu jest martwy, to jest nowa lokalizacja
Nintynuts
89

Chociaż jest to sugerowane w pytaniu, dla każdego, kto ma ten sam problem, w którym nie mogą używać lambd z. Uwzględnij, upewnij się, że masz to:

using System.Data.Entity;
AaronLS
źródło
5

Nie, w tej chwili nie ma oficjalnej obsługi Uwzględnij z wyrażeniem lambda w RTM. Używam tego .

Kiedy mówimy o CTP4, mamy na myśli funkcję Entity Framework. Jest nowszy niż EF4. Zawiera głównie Code First i kilka innych ulepszeń.

Ladislav Mrnka
źródło
Masz jakiś pomysł, kiedy MS będzie obsługiwać tę funkcję? Rozumiem, że wszystkie te metody rozszerzające mają problem z wydajnością w przypadku dużych / wielopoziomowych obiektów - ponieważ muszą wielokrotnie przechodzić przez każde wywołanie dołączenia, a drzewo „definicji” obiektu jest stałe i może być buforowane, nie ma rozwiązania takiego jak to jeszcze.
Dani
Entity Framework Feature jest obecnie w CTP5. Wydaje mi się, że wersja RTM powinna zostać wydana w pierwszym kwartale 2011 roku. Mam więc nadzieję, że będzie zawierać Include z wyrażeniem lambda, ale nie sprawdziłem jeszcze jej implementacji, więc nie mogę powiedzieć, czy używa jakiegokolwiek rodzaju buforowania.
Ladislav Mrnka
31
Ta odpowiedź jest błędna od EF 4.3.x. Inne odpowiedzi są poprawne, trzeba było użyć System.Data.Entity, aby uzyskać przeciążenie wyrażeniami lamda.
Eric J.
1
@EricJ: Tak. Silnie wpisane Include jest dostępne od EF 4,1.
Ladislav Mrnka