代码之家  ›  专栏  ›  技术社区  ›  blu

c linq,其中谓词类型参数

  •  4
  • blu  · 技术社区  · 15 年前

    我有一个具有模拟数据值的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版本有什么不正确?

    2 回复  |  直到 15 年前
        1
  •  11
  •   Jeff Yates    15 年前

    不要将simpleXmlFunction设为表达式<func<xelement,bool>。使其成为func<xelement,bool>。这是作为的代表所期望的。在哪里。

    Func<XElement, bool> simpleXmlFunction =
         new Func<XElement, bool>(b => int.Parse(b.Element("FooId").Value) == 12);
    
        2
  •  4
  •   blu    15 年前

    我认为完整的答案包括前面的答案、大卫·莫顿的评论和更新后的代码片段:

    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集合。