When to use .First and when to use .FirstOrDefault with LINQ?
我到处找了找,还没有找到一个明确的答案,你什么时候想用
您希望何时使用
.First ?只有当您想捕获异常时,如果没有结果返回到哪里?1var result = List.Where(x => x =="foo").First();你想什么时候使用
.FirstOrDefault ?如果没有结果,您什么时候总是想要默认类型?1var result = List.Where(x => x =="foo").FirstOrDefault();就这一点而言,采取什么?
1var result = List.Where(x => x =="foo").Take(1);
当我知道或期望序列至少有一个元素时,我会使用
当您知道需要检查元素是否存在时,使用
最后,
当没有结果时,
在结果中设置分页时,通常使用
希望这有帮助。
.First()将在没有要返回的行时引发异常,而.FirstOrDefault()将返回默认值(所有引用类型的
因此,如果您准备好并愿意处理一个可能的异常,那么
但我想这也是个人喜好。使用对您更有意义的,并且更适合您的编码风格的。
第一()
第一个或默认值()
我们有一个userinfos表,其中有一些记录,如下所示。根据下表,我创建了一个示例…
如何使用first())
1 | var result = dc.UserInfos.First(x => x.ID == 1); |
只有一条记录的id==1。应返回此记录ID:1名字:Manish姓氏:Dubey电子邮件:[email protected]
1 | var result = dc.UserInfos.First(x => x.FName =="Rahul"); |
有多个记录,其中fname="rahul"。第一条记录应返回。ID:7名字:Rahul姓氏:Sharma电子邮件:[email protected]
1 | var result = dc.UserInfos.First(x => x.ID ==13); |
没有ID==13的记录。应该发生错误。InvalidOperationException:序列不包含元素
如何使用FirstOrDefault()。
1 | var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1); |
只有一条记录的id==1。应返回此记录ID:1名字:Manish姓氏:Dubey电子邮件:[email protected]
1 | var result = dc.UserInfos.FirstOrDefault(x => x.FName =="Rahul"); |
有多个记录,其中fname="rahul"。第一条记录应返回。ID:7名字:Rahul姓氏:Sharma电子邮件:[email protected]
1 | var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13); |
没有ID==13的记录。返回值为空
希望它能帮助您理解何时使用
首先,
在
顺便说一下,如果您的序列包含
第一:
- 返回序列的第一个元素
- 引发异常:结果中没有元素
- 当需要一个以上的元素并且只需要第一个元素时使用
FirstOrDefault:
- 返回序列的第一个元素,如果找不到元素,则返回默认值
- 引发异常:仅当源为空时
- 当需要一个以上的元素并且只需要第一个元素时使用。结果为空也可以
发件人:http://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-first-ordefault/
另一个需要注意的区别是,如果您在生产环境中调试应用程序,则可能无法访问行号,因此在方法中标识哪个特定的
异常消息也将不包括您可能使用过的任何lambda表达式,这将使任何问题更难调试。
这就是为什么我总是使用
1 2 3 4 5 | var customer = context.Customers.FirstOrDefault(i => i.Id == customerId); if (customer == null) { throw new Exception(string.Format("Can't find customer {0}.", customerId)); } |
第一()
当您知道结果包含预期的超过1个元素并且您应该只包含序列的第一个元素时。
第一个或默认值()
FirstOrDefault()与First()一样,只是如果没有元素匹配指定的条件,那么它将返回泛型集合的基础类型的默认值。如果找不到元素,则不会引发InvalidOperationException。但元素或序列的集合为空,而不是引发异常。
我找到了一个网站来解释第一个或第二个违约的必要性。http://thepursuitofalive.com/the-linq-first或efault-method-and-null-resultsets/如果查询没有结果,并且要调用First()或Single()以获取单行…您将得到一个"sequence contains no elements"异常。
免责声明:我从来没有用过Linq,所以如果这有点离谱,我很抱歉。
此类型的函数属于元素运算符。下面定义了一些有用的元素运算符。
当需要根据特定条件从序列中选择单个元素时,我们使用元素运算符。下面是一个例子。
1 |
first()运算符返回满足条件后序列的第一个元素。如果找不到元素,那么它将引发异常。
int result=items.where(item=>item==2).first();
firstOrDefault()运算符返回满足条件后序列的第一个元素。如果找不到元素,那么它将返回该类型的默认值。
int result1=items.where(item=>item==2).firstordefault();
1 2 | someList.First(); // exception if collection is empty. someList.FirstOrDefault(); // first item or default(Type) |
用哪一个?它应该由业务逻辑决定,而不是害怕异常/程序失败。
例如,如果业务逻辑表明我们在任何工作日都不能进行零事务处理(只是假设)。那么您不应该尝试用一些智能编程来处理这个场景。我将始终在此类集合上使用first(),并在其他东西破坏业务逻辑时让程序失败。
代码:
1 2 | var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay(); var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault() |
我想看看其他人对此的评论。
好的,我给你两分钱。First/FirstOrDefault用于使用第二个构造函数时。我不会解释它是什么,但你可能会一直使用它,因为你不想引起异常。
1 2 3 4 | person = tmp.FirstOrDefault(new Func<Person, bool>((p) => { return string.IsNullOrEmpty(p.Relationship); })); |
连接许多实现收集单一查询的方法,just we write joins in SQL,a filter can be applied first or last depending on need and necessity.
这是一个例子,说明我们可以在一个收藏中找到一个有标识的元素。在这方面,方法一,