我到处搜索,还没有真正找到关于何时要使用.First
以及何时要将.FirstOrDefault
与 LINQ 结合使用的明确答案。
您什么时候要使用.First
?仅当您希望在没有返回结果的情况下捕获异常时?
var result = List.Where(x => x == "foo").First();
以及何时要使用.FirstOrDefault
?如果您始终想要默认类型(如果没有结果)?
var result = List.Where(x => x == "foo").FirstOrDefault();
那么,Take 呢?
var result = List.Where(x => x == "foo").Take(1);
当我知道或期望序列具有至少一个元素时,我将使用First()
。换句话说,当序列异常为空时,则为空。
当您知道需要检查是否有元素时,请使用FirstOrDefault()
。换句话说,在合法的情况下,序列为空。您不应依赖异常处理来进行检查。 (这是不好的做法,可能会损害性能)。
最后, First()
和Take(1)
之间的区别在于, First()
返回元素本身,而Take(1)
返回一系列元素,其中仅包含一个元素。
如果没有结果,则.First
将引发异常。 .FirstOrDefault
不会,它只会返回 null(引用类型)或值类型的默认值。 (例如,对于 int 来说为0
)这里的问题不是当您想要默认类型时,而是更多:您愿意处理异常还是处理默认值?由于异常应该是例外, FirstOrDefault
在不确定是否要从查询中获取结果时,首选FirstOrDefault
。当逻辑上数据应该存在时,可以考虑异常处理。
设置结果分页时通常使用Skip()
和Take()
。 (例如,显示前 10 个结果,以及下一页上的后 10 个结果,等等)
希望这可以帮助。
如果没有要返回的行, .First()
将引发异常,而.FirstOrDefault()
将返回默认值(所有引用类型为NULL
)。
因此,如果您准备好并愿意处理可能的异常,则.First()
很好。如果您还是想检查!= null
的返回值,那么.FirstOrDefault()
是更好的选择。
但是我想这也是个人喜好。使用对您更有意义的代码,更好地适合您的编码风格。
第一()
FirstOrDefault()
我们有一个 UserInfos 表,其中包含一些记录,如下所示。根据下表,我创建了示例...
如何使用 First()
var result = dc.UserInfos.First(x => x.ID == 1);
只有一条记录,其中 ID ==1。应返回此记录
ID:1 名:Manish 姓:Dubey 电子邮件:xyz@xyz.com
var result = dc.UserInfos.First(x => x.FName == "Rahul");
有多个记录,其中 FName ==“Rahul”。第一条记录应该返回。
ID:7 名:Rahul 姓:Sharma 电子邮件:xyz1@xyz.com
var result = dc.UserInfos.First(x => x.ID ==13);
没有 ID == 13 的记录。应该发生错误。
InvalidOperationException:序列不包含任何元素
如何使用 FirstOrDefault()
var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1);
只有一条记录,其中 ID ==1。应返回此记录
ID:1 名:Manish 姓:Dubey 电子邮件:xyz@xyz.com
var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul");
有多个记录,其中 FName ==“Rahul”。第一条记录应该返回。
ID:7 名:Rahul 姓:Sharma 电子邮件:xyz1@xyz.com
var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13);
没有 ID == 13 的记录。返回值为 null
希望它可以帮助您了解何时使用First()
或FirstOrDefault()
。
首先, Take
是一种完全不同的方法。它返回一个IEnumerable<T>
而不是单个T
,所以就可以了。
在First
和FirstOrDefault
,如果您确定某个元素存在,则应该使用First
;否则,将出现错误。
顺便说一句,如果序列包含default(T)
元素(例如null
),并且您需要区分为空和第一个元素为null
,则不能使用FirstOrDefault
。
第一:
FirstOrDefault:
来自: http : //www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/
另一个需要注意的区别是,如果要在生产环境中调试应用程序,则可能无法访问行号,因此很难确定方法中哪个特定的.First()
语句引发了异常。
异常消息也将不包含您可能使用过的任何 Lambda 表达式,这些表达式甚至会导致更难调试。
这就是为什么我总是使用FirstOrDefault()
的原因,即使我知道 null 条目会构成特殊情况。
var customer = context.Customers.FirstOrDefault(i => i.Id == customerId);
if (customer == null)
{
throw new Exception(string.Format("Can't find customer {0}.", customerId));
}
第一()
当您知道该结果包含多个预期的元素时,您应该只选择序列的第一个元素。
FirstOrDefault()
FirstOrDefault()类似于 First(),不同之处在于,如果没有元素与指定条件匹配,则它返回通用集合的基础类型的默认值。如果未找到任何元素,则不会引发 InvalidOperationException。但是元素或序列的集合为空,否则会引发异常。
此类函数属于元素运算符。下面定义了一些有用的元素运算符。
当需要根据特定条件从序列中选择单个元素时,我们使用元素运算符。这是一个例子。
List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9, 2, 10 };
满足条件后,First()运算符返回序列的第一个元素。如果未找到任何元素,则将引发异常。
int result = items.Where(item => item == 2).First();
满足条件后,FirstOrDefault()运算符返回序列的第一个元素。如果未找到任何元素,则它将返回该类型的默认值。
int result1 = items.Where(item => item == 2).FirstOrDefault();
我找到了一个网站,称其为解释对 FirstOrDefault 的需求
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
如果查询没有结果,并且您想调用 First()或 Single()以获得单行...,您将得到 “序列不包含任何元素” 异常。
免责声明:我从未使用过 LINQ,所以我很抱歉,如果这没有实现。