C # LINQ Où arguments de type de prédicat

c# entity-framework expression-trees lambda

Question

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?

Réponse acceptée

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);

Réponse populaire

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.



Related

Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow
Sous licence: CC-BY-SA with attribution
Non affilié à Stack Overflow