C # LINQ Где аргументы типа предиката

c# entity-framework expression-trees lambda

Вопрос

У меня есть XElement со значениями для макетных данных.

У меня есть выражение для запроса xml:

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

используется в:

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

Ошибка времени разработки:

Аргументы типа для метода «System.Linq.Enumerable.Where (System.Collections.Generic.IEnumerable, System.Func)» не могут быть выведены из использования. Попробуйте явно указать аргументы типа '

Делегат, предоставленный в Where, должен взять XElement и вернуть bool, отметив, соответствует ли элемент запросу запрос, я не уверен, как добавить что-либо еще к делегату или к предложению where, чтобы пометить этот тип.

Кроме того, параллельный метод для реальной функции в отношении Entity Framework не имеет этой проблемы. Что не соответствует версии LINQ-to-XML?

Принятый ответ

Не делайте simpleXmlFunction Expression <Func <XElement, bool >>. Сделайте это Func <XElement, bool>. Это то, что ожидается в качестве делегата. Где.

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

Популярные ответы

Я думаю, что полный ответ включает в себя предыдущий ответ, комментарий Дэвида Мортона и обновленный фрагмент кода:

Реализация .Where для IQueryable отличается от реализации .Where для IEnumerable. IEnumerable.Where ожидает:

Func<XElement, bool> predicate

Вы можете скомпилировать функцию из выражения, которое вы делаете:

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

Это позволит вам посмотреть на генерируемое дерево выражений и использовать скомпилированную форму для запроса коллекции xml.



Related

Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему