何时使用。首先和何时使用.FirstOrDefault与LINQ?

我已经四处search,并没有真正find一个清晰的答案,以什么时候你想要使用.First ,当你想要使用LINQ的.FirstOrDefault

  • 你想什么时候使用.First ? 只有当你想要捕捉exception,如果没有结果返回?

     var result = List.Where(x => x == "foo").First(); 
  • 你想什么时候使用.FirstOrDefault ? 如果没有结果,你总是想要默认的types?

     var result = List.Where(x => x == "foo").FirstOrDefault(); 
  • 对于这个问题,Take呢?

     var result = List.Where(x => x == "foo").Take(1); 

当我知道或期望序列至less有一个元素时,我会使用First() 。 换句话说,当序列是空的例外情况。

当你知道你需要检查是否有元素时,使用FirstOrDefault() 。 换句话说,当序列是空的时候是合法的。 您不应该依赖于检查的exception处理。 (这是不好的做法,可能会损害性能)。

最后, First()Take()之间的区别在于First()返回元素本身,而Take()返回只包含一个元素的元素序列。 (如果你传递1作为参数)。

当没有结果时, .First会抛出exception。 .FirstOrDefault不会,它只会返回null(引用types)或值types的默认值。 (例如0代表一个int)。这里的问题不是当你想要的默认types,而是更多:你是否愿意处理一个exception或处理默认值? 由于exception应该是例外,如果您不确定是否要从查询中获取结果,则首选FirstOrDefault 。 当逻辑上数据应该在那里时,可以考虑exception处理。

Skip()Take()通常用于在结果中设置分页。 (如显示前10个结果,下一个10页等等)

希望这可以帮助。

.First()会抛出一个exception,如果没有行被返回,而.FirstOrDefault()将返回默认值(所有引用types为NULL )。

所以,如果你准备好了并且愿意处理一个可能的exception,那么.First()很好。 如果你喜欢检查!= null的返回值,那么.FirstOrDefault()是你最好的select。

但我想这也是个人偏好。 使用更符合您的意思,更适合您的编码风格。

第一()

  1. 返回一个序列的第一个元素。
  2. 当结果中没有元素或者源为空时,它会抛出一个错误。
  3. 你应该使用它,如果不止一个元素是预期的,你只需要第一个元素。

FirstOrDefault()

  1. 返回序列的第一个元素,如果找不到元素,则返回默认值。
  2. 它只有在源为空的情况下才会引发错误。
  3. 你应该使用它,如果不止一个元素是预期的,你只需要第一个元素。 如果结果是空的也好。

我们有一个UserInfos表,它有一些logging,如下所示。 在这张表的基础上,我创build了一个例子…

用户信息表

如何使用First()

 var result = dc.UserInfos.First(x => x.ID == 1); 

只有一个loggingID == 1应该返回此logging
ID:1名字:Manish姓:Dubey电子邮箱:xyz@xyz.com

 var result = dc.UserInfos.First(x => x.FName == "Rahul"); 

FName ==“Rahul”有多个logging。 首先logging应该是返回。
ID:7名字:Rahul姓:Sharma电子邮箱:xyz1@xyz.com

 var result = dc.UserInfos.First(x => x.ID ==13); 

没有ID == 13的logging。应该发生错误。
InvalidOperationException:序列不包含任何元素

如何使用FirstOrDefault()

 var result = dc.UserInfos.FirstOrDefault(x => x.ID == 1); 

只有一个loggingID == 1应该返回此logging
ID:1名字:Manish姓:Dubey电子邮箱:xyz@xyz.com

 var result = dc.UserInfos.FirstOrDefault(x => x.FName == "Rahul"); 

FName ==“Rahul”有多个logging。 首先logging应该是返回。
ID:7名字:Rahul姓:Sharma电子邮箱:xyz1@xyz.com

 var result = dc.UserInfos.FirstOrDefault(x => x.ID ==13); 

没有ID == 13的logging。返回值为空

希望它能帮助你理解何时使用First()FirstOrDefault()

首先, Take是一个完全不同的方法。 它返回一个IEnumerable<T>而不是一个T ,所以这是不可能的。

FirstFirstOrDefault ,当你确定一个元素存在时,你应该使用First ,如果不存在,那么就有一个错误。

顺便说一句,如果你的序列包含default(T)元素(例如null ),你需要区分为空和第一个元素为null ,你不能使用FirstOrDefault

第一:

  • 返回序列的第一个元素
  • 抛出exception:结果中没有元素
  • 在以下情况下使用:当期望超过1个元素时,只需要第一个元素

FirstOrDefault:

  • 返回序列的第一个元素,如果找不到元素,则返回默认值
  • 引发exception:仅当源为空时
  • 在以下情况下使用:当期望超过1个元素时,只需要第一个元素。 结果也可以是空的

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

另外需要注意的是,如果您在Production环境中debugging应用程序,则可能无法访问行号,因此识别方法中哪个特定的.First()语句会引发exception可能很困难。

exception消息也将不包含任何您可能使用的Lambdaexpression式,这会使任何问题更难以debugging。

这就是为什么我总是使用FirstOrDefault()即使我知道一个空条目将构成一个特殊情况。

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

我find了一个网站,解释FirstOrDefault的需求
http://thepursuitofalife.com/the-linq-firstordefault-method-and-null-resultsets/
如果查询没有结果,并且您想要调用First()或Single()来获取单个行,那么您将得到一个“Sequence contains no elements”exception。

免责声明:我从来没有使用过LINQ,所以我很抱歉,如果这是不公平的。

 someList.First(); // exception if collection is empty. someList.FirstOrDefault(); // first item or default(Type) 

哪一个使用? 应该由业务逻辑来决定,而不是担心exception/程序失败。

例如,如果业务逻辑表示在任何工作日都不能有零交易(假设)。 那么你不应该尝试用一些聪明的编程来处理这种情况。 我总是使用First()来处理这样的集合,并且如果别的东西搞砸了业务逻辑,就让程序失败。

码:

 var transactionsOnWorkingDay = GetTransactionOnLatestWorkingDay(); var justNeedOneToProcess = transactionsOnWorkingDay.First(): //Not FirstOrDefault() 

我想看看其他人对此的评论。

第一()

当你知道结果包含多于一个的元素,你应该只有序列的第一个元素。

FirstOrDefault()

FirstOrDefault()与First()类似,只是如果没有元素匹配指定的条件,它将返回generics集合的基础types的默认值。 如果找不到元素,它不会抛出InvalidOperationException。 但是元素或者序列的集合是空的,而不是抛出exception。

好的,让我给我两分钱。 First / Firstordefault适用于使用第二个构造函数的情况。 我不会解释它是什么,但是当你可能总是使用一个,因为你不想引起exception。

 person = tmp.FirstOrDefault(new Func<Person, bool>((p) => { return string.IsNullOrEmpty(p.Relationship); })); 

这种types的函数属于元素操作符。下面定义了一些有用的元素操作符。

  1. 首先/ FirstOrDefault
  2. 最后/ LastOrDefault
  3. 单/的SingleOrDefault

当我们需要根据一定条件从一个序列中select一个元素时,我们使用元素操作符。 这里是例子。

  List<int> items = new List<int>() { 8, 5, 2, 4, 2, 6, 9,2,10}; 

First()运算符在满足条件之后返回序列的第一个元素。 如果找不到元素,则会通过exception。

int result = items.Where(item => item == 2).First();

FirstOrDefault()运算符在满足条件之后返回序列的第一个元素。 如果没有find元素,则会返回该types的默认值。

int result1 = items.Where(item => item == 2).FirstOrDefault();

对不起,张贴答复旧post。 细节和很好的解释,所以请阅读下面的urlhttp://www.technicaloverload.com/linq-single-vs-singleordefault-vs-first-vs-firstordefault/

http://www.dotnet-tricks.com/Tutorial/linq/E23I160714-Understanding-Single,-SingleOrDefault,-First-and-FirstOrDefault.html

http://www.c-sharpcorner.com/UploadFile/3d39b4/singleordefault-and-firstordefault-methods-in-linq-to-sql/

LINQ的许多方法来实现对集合的单个简单查询,只是我们在sql中写入连接,根据需要和必要性,可以首先应用filter或者filter。

这里是一个例子,我们可以在集合中find一个id为id的元素。 要添加更多,首先, FirstOrDefault方法,理想情况下将返回相同时收集至less有一个logging。 但是,如果一个集合是可以空的。 那么First将返回一个exception,但是FirstOrDefault将返回null或者default。 例如, int将返回0.因此,这样的用法虽然被称为个人偏好,但是使用FirstOrDefault来避免exception处理更好。 这里是一个例子,我们运行一个transactionlist的集合