Lambda vs LINQ-“表达式总是错误的”

Posted

技术标签:

【中文标题】Lambda vs LINQ-“表达式总是错误的”【英文标题】:Lambda vs LINQ- "Expression is always false" 【发布时间】:2011-09-20 05:22:02 【问题描述】:

我有以下代码:

var thing = (from t in things
             where t.Type == 1 && t.IsActive
             select t).SingleOrDefault();

if (thing == null)

    // throw exception

things 是实体框架自跟踪实体的集合

这很好用,但是我想改用 Lambda 表达式并将 LINQ 更改为:

var thing = things.Select(t => t.Type == 1 && t.IsActive).SingleOrDefault();

现在 Resharper 告诉我 Expression is always false(thing == null)

我错过了什么?

【问题讨论】:

【参考方案1】:

你想要:

var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault();

Select 执行投影(将 IEnumerable 的类型从 IEnumerable<Thing> 转换为 IEnumerable<bool>,如果为 true,则为 t.Type == 1 && t.IsActive == true,否则为 false),然后 SingleOrDefault 返回唯一的 @此序列中的 987654329@,或者如果序列为空,则为 bool 的默认值 false。这永远不能为空,因为bool 不是引用类型。

Where 执行过滤操作(仅提取那些满足给定标准的对象 - 在这种情况下,仅选择那些 Type1IsActivetrue 的对象),留下类型IEnumerable 为IEnumerable<Thing>。假设Thing 是一个类,SingleOrDefault 将返回序列中的唯一项或null

在任何一种情况下,如果序列包含多个项目,SingleOrDefault 都会抛出异常(这在Select 版本中更可能发生!)。

【讨论】:

以上是关于Lambda vs LINQ-“表达式总是错误的”的主要内容,如果未能解决你的问题,请参考以下文章

Linq和Lambda 性能对比

Linq.join_lambda知识点

LINQ 以 Lambda 形式选择不同计数

为啥 Lambda 变量范围存在于 LINQ 查询之外?

Linq之Lambda表达式

linq / lambda 中的多行 foreach 循环