2009-02-09 12 views
4

J'ai un objet XElement avec des valeurs pour les données fantaisie.C# LINQ Emplacement des arguments de type prédicat

I ont 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 temps de conception est la suivante:

Les arguments de type de procédé « System.Linq. Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func) 'ne peut pas être déduit de l'utilisation. Essayez de spécifier explicitement les arguments de type '

Le délégué fourni à Où doit prendre un XElement et retourner un booléen, en marquant 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 n'est pas correct avec la version LINQ-XML?

Répondre

10

Ne pas faire de simpleXmlFunction une expression < Func < XElement, bool > >. Faites-en un Func < XElement, bool >. C'est ce qui est attendu en tant que délégué de .Where.

Func<XElement, bool> simpleXmlFunction = 
    new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12); 
+0

Pourquoi cela fonctionne-t-il pour Entity.Where alors? – blu

+0

L'implémentation .Where pour IQueryable est différente de l'implémentation .Where pour IEnumerable . –

+0

ahh je le vois, merci pour la clarification. – blu

3

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:

La mise en œuvre .Lorsque pour IQueryable est différente de la mise en œuvre .Lorsque pour IEnumerable. IEnumerable.Where attend un:

Func<XElement, bool> predicate 

Vous pouvez compiler la fonction 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 regarder l'arbre d'expression générée et d'utiliser la forme compilée interroger la collection xml.