Linq查询语法和复杂条件

时间:2011-09-04 17:00:08

标签: linq-to-objects

我想使用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表达式?

1 个答案:

答案 0 :(得分:3)

您的查询会被翻译为:

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

...没有编译因为(警告:技术错误可能在这里)Where()需要类型为Func<TSource, bool>的参数。您正在为其提供一个可转换为Func<TSource, Func<???, bool>>类型的参数。该错误告诉您lambda表达式无法转换为bool,因为lambda表达式只能转换为委托类型(例如Func<...>,而bool不是委托类型。(/ end bumbling explanation)

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

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;