2010-10-12 51 views
0

这两个Lambda表达式之间有什么区别?而第二个似乎更紧凑,我应该总是这样做?这两个lambda表达式有区别吗?

DataContext.Employee.Where(c=>c.id==check_id && c.username==user_name).Select(c=>c.Name).FirstOrDefault(); 

DataContext.Employee.FirstOrDefault(c=>c.id==check_id && c.username==user_name).Name; 
+0

顺便说一句 - 可能希望将“c.username = user_name”更改为“c.username == user_name” – 2010-10-12 15:08:32

回答

15

第二个版本可以抛出一个NullReferenceException如果一个匹配元件没有找到与该类型的默认值是null

第一个版本没有这个问题。

+0

要添加到此,两个语句是完全不同的。首先是先进行过滤,然后再进行第一次过滤。其次是挑选第一条记录,然后尝试将其与过滤条件进行匹配。意图是完全不同的,第二个似乎给了错误的业务结果(技术上它会起作用)。 – Pradeep 2010-10-12 15:55:31

+2

@Pradeep:你的意思是'FirstOrDefault'条件返回第一个元素,如果它匹配条件?这不是真的。 'FirstOrDefault'条件返回第一个元素THAT匹配条件,它可以是第二个或任何其他,只是第一个匹配。所以业务结果可以,只有'NullReferenceException'提到的问题。 – NOtherDev 2010-10-13 08:08:21