Linq 查询语法和复杂的Where 条件
我想使用 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 表达式?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您的查询被转换为如下内容:
...无法编译,因为(警告:可能存在技术错误)
Where()
需要一个Func 类型的参数
。您给它一个参数,该参数将转换为类型Func>
。该错误告诉您 lambda 表达式无法转换为 bool,因为 lambda 表达式只能转换为委托类型(例如Func<...>
,而 bool 不是委托类型.(/结束笨拙的解释)在查询语法中,您在
where
子句中输入的任何内容都位于生成的Where( 的 lambda 表达式中的
方法调用。第一个片段可以重写为:=>
之后)这相当于:
如果你确实需要一个带有语句块的 lambda,你可以这样做:
或内联它:
或者你可以使用常规方法而不是匿名方法:
your query gets translated to something like:
...which doesn't compile because (warning: technical errors probably be here)
Where()
expects a parameter of typeFunc<TSource, bool>
. You are giving it a parameter that would get converted to typeFunc<TSource, Func<???, bool>>
. The error is telling you that a lambda expression cannot be converted to a bool, because lambda expressions can only be converted to delegate types (e.g.Func<...>
, and bool is not a delegate type.(/end bumbling explanation)In query syntax, whatever you put in your
where
clause goes after the=>
in the lambda expression for the generatedWhere()
method call. Note that your first snippet can be rewritten as:which is equivalent to:
if you really need a lambda with a statement block in it you can do:
or to inline it:
or you can use a regular method instead of an anonymous one: