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
执行过滤操作(仅提取那些满足给定标准的对象 - 在这种情况下,仅选择那些 Type
是 1
和 IsActive
是 true
的对象),留下类型IEnumerable 为IEnumerable<Thing>
。假设Thing
是一个类,SingleOrDefault
将返回序列中的唯一项或null
。
在任何一种情况下,如果序列包含多个项目,SingleOrDefault
都会抛出异常(这在Select
版本中更可能发生!)。
【讨论】:
以上是关于Lambda vs LINQ-“表达式总是错误的”的主要内容,如果未能解决你的问题,请参考以下文章