4

我有一个带有模拟数据值的 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 子句添加更多内容以标记类型。

此外,针对实体框架的实际功能的并行方法不存在此问题。LINQ-to-XML 版本有什么不正确的地方?

4

2 回答 2

11

不要将 simpleXmlFunction 设为 Expression<Func<XElement, bool>>。使其成为 Func<XElement, bool>。这就是 .Where 的代表所期望的。

Func<XElement, bool> simpleXmlFunction =
     new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);
于 2009-02-09T18:12:07.517 回答
4

我认为完整的答案包括之前的答案、David Morton 的评论和更新的代码片段:

IQueryable 的 .Where 实现不同于 IEnumerable 的 .Where 实现。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 集合。

于 2009-02-09T22:26:04.660 回答