我有一个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子句添加更多内容以标记该类型。
此外,针对实体框架的实际功能的并行方法没有此问题。 LINQ-to-XML版本有什么不正确的?
答案 0 :(得分:11)
不要将simpleXmlFunction设为表达式&lt; Func&lt; XElement,bool&gt;&gt;。使它成为一个Func&lt; XElement,bool&gt;。这就是.Where的代表所期待的。
Func<XElement, bool> simpleXmlFunction =
new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);
答案 1 :(得分: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集合。