我有以下代码:
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)
。
我错过了什么?
答案 0 :(得分:15)
你想:
var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault();
Select
执行投影(如果IEnumerable<Thing>
,则将IEnumerable<bool>
的IEnumerable类型转换为true
,其值为t.Type == 1 && t.IsActive == true
,否则为false
),然后SingleOrDefault
返回此序列中的唯一bool
,如果序列为空,则返回bool
的默认值false
。由于bool
不是引用类型,因此永远不能为空。
Where
执行过滤操作(仅提取符合给定条件的对象 - 在这种情况下,仅选择Type
为1
且IsActive
为true
的对象{1}}),将IEnumerable的类型保留为IEnumerable<Thing>
。假设Thing
是一个类,SingleOrDefault
将返回序列中唯一的项目或null
。
在任何一种情况下,如果序列包含多个项目,SingleOrDefault
将抛出异常(在Select
版本中更有可能!)。