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)

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 .


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;

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ń.


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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.