何时使用。首先和何时使用.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。
但我想这也是个人偏好。 使用更符合您的意思,更适合您的编码风格。
第一()
- 返回一个序列的第一个元素。
- 当结果中没有元素或者源为空时,它会抛出一个错误。
- 你应该使用它,如果不止一个元素是预期的,你只需要第一个元素。
FirstOrDefault()
- 返回序列的第一个元素,如果找不到元素,则返回默认值。
- 它只有在源为空的情况下才会引发错误。
- 你应该使用它,如果不止一个元素是预期的,你只需要第一个元素。 如果结果是空的也好。
我们有一个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
,所以这是不可能的。
在First
和FirstOrDefault
,当你确定一个元素存在时,你应该使用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的函数属于元素操作符。下面定义了一些有用的元素操作符。
- 首先/ FirstOrDefault
- 最后/ LastOrDefault
- 单/的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/
LINQ的许多方法来实现对集合的单个简单查询,只是我们在sql中写入连接,根据需要和必要性,可以首先应用filter或者filter。
这里是一个例子,我们可以在集合中find一个id为id的元素。 要添加更多,首先, FirstOrDefault
方法,理想情况下将返回相同时收集至less有一个logging。 但是,如果一个集合是可以空的。 那么First
将返回一个exception,但是FirstOrDefault
将返回null
或者default。 例如, int
将返回0.因此,这样的用法虽然被称为个人偏好,但是使用FirstOrDefault
来避免exception处理更好。