【问题标题】:Linq Query Syntax and Complex Where ConditionsLinq 查询语法和复杂的 Where 条件
【发布时间】:2011-09-06 09:00:25
【问题描述】:

我想使用 Linq to Objects 查询根据相当复杂的选择标准从列表中选择某些成员(为了简化,这里表示为 return true :-)

使用 Where 扩展方法,效果很好:

    var matches = (from wm in Members
                   select wm).Where(p =>
                   {
                       return true;
                   });

但是,当我尝试使用查询语法做同样的事情时:

    var matches2 = (from wm in Members
                    where (p =>
                    {
                        return true;
                    })
                   select wm);

编译器对象

无法将 lambda 表达式转换为类型“bool”,因为它不是 委托类型

幕后发生了什么,如何使用带有查询语法的 lamda 表达式?

【问题讨论】:

    标签: linq-to-objects


    【解决方案1】:

    您的查询被翻译成如下内容:

    Members.Where(member=> p=>{return true;});
    

    ...无法编译,因为(警告:技术错误可能在这里)Where() 需要Func<TSource, bool> 类型的参数。您正在给它一个参数,该参数将被转换为类型Func<TSource, Func<???, bool>>。错误告诉你 lambda 表达式不能转换为 bool,因为 lambda 表达式只能转换为委托类型(例如Func<...>,而 bool 不是委托类型。(/结束笨拙的解释)

    在查询语法中,您在 where 子句中输入的任何内容都放在生成的 Where() 方法调用的 lambda 表达式中的 => 之后。请注意,您的第一个 sn-p 可以重写为:

    Members.Where(p=>true);
    

    相当于:

    from m in members 
    where true 
    select m;
    

    如果你真的需要一个带有语句块的 lambda,你可以这样做:

    var lam = (Member m)=> {return true;};
    from m in members
    where lam(m)
    select m;
    

    或内联它:

    from m in members
    where ((Func<Member, bool>)(Member m)=> {return true;})(m)
    select m;
    

    或者您可以使用常规方法而不是匿名方法:

    public bool DoStuff(int i)
    {
        return true;
    }
    
    ...
    
    from m in members
    where DoStuff(m)
    select m;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多