C # LINQ Donde Argumentos de Tipo de Predicado

c# entity-framework expression-trees lambda

Pregunta

Tengo un XElement con valores para datos simulados.

Tengo una expresión para consultar el xml:

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

utilizada en:

var simpleXml = xml.Elements("Foo").Where(simpleXmlFunction).First();

El error de tiempo de diseño es:

Los argumentos de tipo para el método 'System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)' no se pueden inferir del uso. Intenta especificar los argumentos de tipo explícitamente '

El delegado suministrado a Where debería incluir un XElement y devolver un bool, marcando si el elemento coincide con la consulta, no estoy seguro de cómo agregar algo más al delegado o la cláusula where para marcar el tipo.

Además, el método paralelo para la función real en Entity Framework no tiene este problema. ¿Qué no es correcto con la versión de LINQ-to-XML?

Respuesta aceptada

No convierta simpleXmlFunction en una expresión <Func <XElement, bool >>. Hazlo un Func <XElement, bool>. Eso es lo que se espera como delegado de .Where.

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

Respuesta popular

Creo que la respuesta completa incluye la respuesta anterior, el comentario de David Morton y un fragmento de código actualizado:

La implementación de .Where para IQueryable es diferente de la implementación de .Where para IEnumerable. IEnumerable.Donde espera un:

Func<XElement, bool> predicate

Puedes compilar la función desde la expresión que tienes haciendo:

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

Esto le permitirá ver el árbol de expresiones generado y usar el formulario compilado para consultar la colección xml.



Related

Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow