我到处搜索,并没有真正找到一个明确的答案,什么时候你想使用. first,什么时候你想使用. firstordefault与LINQ。

什么时候你想用。first ?只有当你想捕捉异常,如果没有结果返回哪里? var result =列表。Where(x => x == "foo").First(); 什么时候使用。firstordefault ?当你总是想默认类型,如果没有结果? var result =列表。Where(x => x == "foo").FirstOrDefault(); 说到这,那塔克呢? var result =列表。Where(x => x == "foo").Take(1);


当前回答

第一:

返回序列的第一个元素 抛出异常:结果中没有元素 使用when:当期望有多个元素,而您只想要第一个元素时

FirstOrDefault:

返回序列的第一个元素,如果没有找到元素,则返回默认值 抛出异常:仅当源为空时 使用when:当期望有多个元素,而您只想要第一个元素时。同样,结果为空也是可以的

来自:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

其他回答

当我知道或期望序列至少有一个元素时,我会使用First()。换句话说,当出现异常时,序列为空。

当您知道需要检查是否存在元素时,请使用FirstOrDefault()。换句话说,当序列为空是合法的时候。您不应该依赖异常处理进行检查。(这是不好的做法,可能会影响性能)。

最后,First()和Take(1)之间的区别是First()返回元素本身,而Take(1)返回只包含一个元素的元素序列。

我发现了一个网站,它似乎解释了对FirstOrDefault的需求 http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/ 如果查询没有结果,并且您想调用First()或Single()来获得单行…您将得到一个“序列不包含元素”异常。

免责声明:我从未使用过LINQ,所以如果这是错误的,我很抱歉。

Others have very well described the difference between First() and FirstOrDefault(). I want to take a further step in interpreting the semantics of these methods. In my opinion FirstOrDefault is being overused a lot. In the majority of the cases when you’re filtering data you would either expect to get back a collection of elements matching the logical condition or a single unique element by its unique identifier – such as a user, book, post etc... That’s why we can even get as far as saying that FirstOrDefault() is a code smell not because there is something wrong with it but because it’s being used way too often. This blog post explores the topic in details. IMO most of the times SingleOrDefault() is a much better alternative so watch out for this mistake and make sure you use the most appropriate method that clearly represents your contract and expectations.

Linq有很多方法来实现对集合的简单查询,只要我们在sql中写入连接,过滤器可以根据需要或必要性先应用或最后应用。

下面是一个示例,我们可以在集合中找到带有id的元素。 为了进一步说明这一点,当一个集合至少有一条记录时,方法First和FirstOrDefault理想情况下会返回same。但是,如果集合可以为空的话。那么First将返回一个异常,而FirstOrDefault将返回null或默认值。例如,int将返回0。因此,虽然说使用such是个人偏好,但最好使用FirstOrDefault来避免异常处理。

另一个需要注意的区别是,如果您在生产环境中调试应用程序,您可能无法访问行号,因此识别方法中哪个特定的. first()语句抛出异常可能很困难。

异常消息也不包括您可能使用过的任何Lambda表达式,这会使任何问题更难调试。

这就是为什么我总是使用FirstOrDefault(),即使我知道空条目将构成异常情况。

var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
   throw new Exception(string.Format("Can't find customer {0}.", customerId));
}