У меня есть 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.