J'ai le bit de code suivant:Comment créer une expression LINQ à partir d'une propriété de navigation Entity Framework?
Expression<Func<Subscription, Service>> service2= subscription => (from relationship in subscription.ChildRelationships
select relationship.SecondService).FirstOrDefault();
Il crée une expression que je peux utiliser plus tard dans le cadre d'une requête avec le cadre de l'entité. Le code que j'utilise a une clause where mais je l'ai omis pour la lisibilité. Cela fonctionne très bien et je suis capable de l'exécuter dans LINQPad que j'utilise pour tester.
Si je change le code:
Expression<Func<Subscription, IQueryable<Service>>> service2= subscription => (from relationship in subscription.ChildRelationships
select relationship.SecondService);
ne plus Compile et a l'erreur suivante:
Cannot convert lambda expression to delegate type 'System.Func<Farmworks.Data.Subscription,System.Linq.IQueryable<Farmworks.Data.Service>>' because some of the return types in the block are not implicitly convertible to the delegate return type
Il semble être parce ChildRelationships qui est une propriété de navigation ne met pas en œuvre IQueryable. Il est en fait de type EntityCollection qui implémente IEnumerable mais n'est pas bon pour créer des expressions qui fonctionnent avec EF. Je pense que je comprends pourquoi le deuxième bloc de code ne fonctionne pas et aimerait savoir comment le réécrire de telle sorte que cela fonctionne. Ce qui m'intrigue aussi, c'est pourquoi le premier bloc de code fonctionne. Il utilise également la propriété de navigation ChildRelationships mais n'a aucun problème pour devenir une expression qui fonctionne avec EF.
Quelqu'un peut-il jeter de la lumière?
Essayé le code mais obtenu le suivant: Une expression de type 'Data.Service' n'est pas autorisée dans une clause from dans une expression de requête avec le type de source 'System.Data.Objects.DataClasses.EntityCollection '. L'inférence de type a échoué dans l'appel de 'SelectMany'. –
GiddyUpHorsey
OK, je réalise ce que sont les types ici. Je vais réécrire ma réponse. –