J'ai un XElement avec des valeurs pour les données fictives.
J'ai une expression pour interroger le XML:
Expression<Func<XElement, bool>> simpleXmlFunction =
b => int.Parse(b.Element("FooId").Value) == 12;
utilisé dans:
var simpleXml = xml.Elements("Foo").Where(simpleXmlFunction).First();
L'erreur de conception est:
Les arguments de type de la méthode 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' ne peuvent pas être déduits de l'utilisation. Essayez de spécifier explicitement les arguments de type '
Le délégué fourni à Where doit prendre un XElement et renvoyer un bool, en indiquant si l'élément correspond à la requête, je ne sais pas comment ajouter quoi que ce soit au délégué ou à la clause where pour marquer le type.
En outre, la méthode parallèle pour la fonction réelle par rapport à Entity Framework n'a pas ce problème. Qu'est-ce qui ne va pas avec la version LINQ-to-XML?
Ne faites pas de simpleXmlFunction une expression <Func <XElement, bool >>. Faites-en un Func <XElement, bool>. C'est ce à quoi on s'attend en tant que délégué de .Where.
Func<XElement, bool> simpleXmlFunction =
new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);
Je pense que la réponse complète comprend la réponse précédente, le commentaire de David Morton et un extrait de code mis à jour:
L'implémentation .Where pour IQueryable est différente de celle de .Where pour IEnumerable. IEnumerable.Where attend un:
Func<XElement, bool> predicate
Vous pouvez compiler la fonction à partir de l'expression que vous avez en faisant:
Expression<Func<XElement, bool>> simpleXmlExpression =
b => int.Parse(b.Element("FooId").Value) == 12;
Func<XElement, bool> simpleXmlFunction = simpleXmlExpression.Compile();
var simpleXml = xml.Elements("Foo").Where(simpleXmlFunction).First();
Cela vous permettra de consulter l'arborescence d'expression générée et d'utiliser le formulaire compilé pour interroger la collection XML.