繁体   English   中英

C#LINQ谓词类型参数

[英]C# LINQ Where Predicate Type Arguments

我有一个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版本有什么不正确之处?

不要将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);

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

IQueryable的实现与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集合。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM