Utilisation de l'inclusion dans Entity Framework 4 avec des expressions lambda

88

J'ai vu de nombreux articles sur la façon de surmonter ce problème, tous liés à CTP4, ou sur l'ajout de mes propres méthodes d'extension.

Existe-t-il un moyen inclus dans EF4 "officiel" d'utiliser les expressions lambda dans include (à la fois pour les relations de premier niveau et aussi pour le deuxième niveau et plus) ou est-ce qu'il n'a finalement pas été inclus dans le RTM?

Il y en a un - je serais heureux d'apprendre comment le faire, car utiliser l'expression lambda dans mon code maintenant (avec # system.data.entity # system.data.linq) me donne toujours:

Impossible de convertir l'expression lambda en type «chaîne» car il ne s'agit pas d'un type délégué sur:

var customers = from c in
context.Customers.Include(c=>c.Phone)
Dani
la source
1
non, il n'existe pas (à part CTP4 - comme vous le dites). J'utilise des méthodes d'extension / enums pour atteindre la sécurité de type.
RPM1984
Je l'ai fait aussi, donc MS l'a inclus sur CTP4 et l'a supprimé dans RTM?
Dani

Réponses:

229

La version RTM d'Entity Framework 4.1 inclut en fait des méthodes d'extension dans le EntityFramework.dllfichier, pour un chargement hâtif avec lambda via la Includefonction. Incluez simplement la DLL dans votre projet et vous devriez être capable d'écrire du code comme:

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

N'oubliez pas d'ajouter une instruction Import / Using pour inclure l' espace de noms System.Data.Entity . Sinon, le compilateur ne peut pas trouver les méthodes d'extension. Par exemple:

using System.Data.Entity;

Consultez cet article du blog de l'équipe ADO.NET pour plus d'informations.

cécilphillip
la source
1
Bien que le lien vers le blog ADO.net soit toujours pertinent, la référence / guide EF6 pour le même sujet est: Chargement des entités connexes Je pense que la documentation doit basculer vers les exemples Princess et Unicorn au lieu du blog et de l'article qu'ils utilisent partout.
Arkaine55
1
merci, je viens d'ajouter en utilisant System.Data.Entity; son travail moi.
adnan
Le lien du blog de l'équipe est mort, c'est le nouvel emplacement
Nintynuts
89

Bien que cela soit implicite dans la question, pour toute autre personne qui a le même problème où elle ne peut pas utiliser de lambdas avec .Include, assurez-vous d'avoir ceci:

using System.Data.Entity;
AaronLS
la source
5

Non, il n'y a pas de support officiel pour Inclure avec expression lambda dans RTM pour le moment. J'utilise ça .

Lorsque nous parlons de CTP4, nous entendons Entity Framework Feature. C'est une API plus récente que EF4. Il comprend principalement Code First et quelques autres améliorations.

Ladislav Mrnka
la source
Une idée de quand MS prendra-t-elle en charge cette fonctionnalité? Je comprends que toutes ces méthodes d'extension ont un problème de performances avec un objet grand / multiniveau - car elles doivent traverser encore et encore chaque appel pour include, et bien que l'arborescence de "définition" de l'objet soit constante et puisse être mise en cache, il n'y a pas de solution comme ceci encore.
Dani
Entity Framework Feature est actuellement dans CTP5. J'imagine que la version RTM devrait être publiée dans le premier trimestre de 2011. Donc j'espère qu'elle contiendra Inclure avec l'expression lambda mais je n'ai pas encore vérifié son implémentation donc je ne peux pas dire si elle utilise une sorte de cache.
Ladislav Mrnka
31
Cette réponse est erronée depuis EF 4.3.x. Les autres réponses sont correctes, il faut utiliser System.Data.Entity pour obtenir la surcharge avec les expressions lamda.
Eric J.
1
@EricJ: Oui. L'inclusion fortement typée est disponible depuis EF 4.1.
Ladislav Mrnka