C # LINQ, где аргументы типа предиката - PullRequest
4 голосов
/ 09 февраля 2009

У меня есть 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 и вернуть логическое значение, отмечая, что элемент соответствует запросу, я не уверен, как добавить что-либо еще к делегату или предложению where для маркировки типа.

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

Ответы [ 2 ]

11 голосов
/ 09 февраля 2009

Не делайте simpleXmlFunction выражением >. Сделайте это Func . Это то, что ожидается от делегата .Where.

Func<XElement, bool> simpleXmlFunction =
     new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);
4 голосов
/ 10 февраля 2009

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

Реализация .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.

...