EF中使用Linq时First、FirstOrDefault、Single、SingleOrDefault几个方法的区别
EF中使用Linq时First、FirstOrDefault、Single、SingleOrDefault几个方法的区别
一、前言
在使用EntityFramework开发时,.NET的System.Linq.Enumerable类为我们提供了许多Linq方法。
给大家分享一下关于First、FirstOrDefault、Single、SingleOrDefault几个方法的区别实例及使用场景,首先是关于这几个方法的定义:
● First:返回序列中的第一条记录,如果没有记录,则引发异常。
● FirstOrDefault:返回序列中的第一条记录,如果没有记录,则返回默认值。
● Single:返回序列中的唯一记录,如果没有或返回多条记录,则引发异常。
● SingleOrDefault:返回序列中的唯一记录;如果该序列为空,则返回默认值;如果该序列包含多个元素,则引发异常。
二、实例和用法
1、First与FirstOrDefault
◆ First返回序列中的第一条记录,如果没有记录,则引发异常,示例代码如下:
static void Main(string[] args)
{
string[] strName = { "Fred", "Gary", "William", "Charles" };
string[] strNameEmpty = { };
try
{
string tempName = strName.First();
Console.WriteLine("First()第一种 返回序列中的第一条记录。");
Console.WriteLine("信息为:{0}", tempName);
//如果序列中没有元素则会发生,InvalidOperationException 异常。 源序列为空。
string tempNameEmpty = strNameEmpty.First();
}
catch (Exception ex)
{
Console.WriteLine("First()第二种 返回序列中没有元素,引发异常。");
Console.WriteLine("信息为:{0}", ex.Message);
}
}
结果如下图所示:

◆ FirstOrDefault返回序列中的第一条记录,如果序列中不包含任何记录,则返回默认值(对于可以为null的对象,默认值为null,对于不能为null的对象,如int,默认值为0),示例代码如下:
static void Main(string[] args)
{
string[] strName = { "Fred", "Fred", "William", "Charles" };
string[] strNameEmpty = { };// string 类型的默认值是空
string tempName = strName.FirstOrDefault();
Console.WriteLine("FirstOrDefault()第一种 返回序列中的第一条记录。");
Console.WriteLine("信息为:{0}", tempName);
string tempNameEmpty = strNameEmpty.FirstOrDefault();
Console.WriteLine("FirstOrDefault()第二种 如果序列中不包含任何记录,则返回默认值。");
Console.WriteLine("信息为:{0}", tempNameEmpty);
}
结果如下图所示:

2、Single与SingleOrDefault
◆ Single返回序列中的唯一一条记录,如果没有或返回多条,则引发异常,示例代码如下:
static void Main(string[] args)
{
string[] strName = { "Fred"};
string[] strNameEmpty = { };
try
{
string tempName = strName.Single();
Console.WriteLine("Single()第一种 返回序列中的唯一一条记录。");
Console.WriteLine("信息为:{0}", tempName);
//没有或返回多条,则引发异常。 string[] strNameEmpty = { "Fred","Crazy"};
string tempNameEmpty = strNameEmpty.Single();
}
catch (Exception ex)
{
Console.WriteLine("Single()第二种 没有或返回多条,则引发异常。");
Console.WriteLine("信息为:{0}", ex.Message);
}
}
结果如下图所示:

◆ SingleOrDefault返回序列中满足指定条件的唯一元素;如果这类元素不存在,则返回默认值;如果有多个元素满足该条件,此方法将引发异常,示例代码如下:
static void Main(string[] args)
{
string[] strName = { "Fred"};
string[] strNameEmpty = { };
string[] strEmpty = { "Fred", "Crazy" };
try
{
string tempName = strName.SingleOrDefault();
Console.WriteLine("SingleOrDefault()第一种 返回序列中的唯一记录。");
Console.WriteLine("信息为:{0}", tempName);
string tempNameEmpty = strNameEmpty.SingleOrDefault();
Console.WriteLine("SingleOrDefault()第二种 如果该序列为空,则返回默认值。");
Console.WriteLine("信息为:{0}", tempNameEmpty);
//序列包含多个元素,则引发异常 string[] strNameEmpty = { "Fred","Crazy"};
string tempEmpty = strEmpty.SingleOrDefault();
}
catch (Exception ex)
{
Console.WriteLine("SingleOrDefault()第三种 如果该序列包含多个元素,则引发异常。");
Console.WriteLine("信息为:{0}", ex.Message);
}
}
结果如下图所示:

三、什么时候用First、FristOrDefault、Single、SingleOrDefault?
1、当集合中只有一个元素时,可以使用Single。
2、当集合中不包含任何元素但需要返回默认值时,可以使用SingleOrDefault。
3、当集合中包含多个元素并想抛出异常时,可以使用Single或SingleOrDefault。
4、无论集合中是否有元素,我们都想要返回一个记录时,可以使用First或FirstOrDefault。
5、当集合中不包含任何元素但需要返回默认值时,可以使用FirstOrDefault。
四、总结
First和Single的区别:前者是TOP(1)后者是TOP(2),后者如果查询到两条数据则抛出异常。所以在必要的时候使用Single也不会比First慢多少。
FirstOrDefault与SingleOrDefault的性能比较:
FirstOrDefault通常在性能上会比SingleOrDefault表现得比优,因为FirstOrDefault是从集合开始位置查找到第一个匹配的元素就返回,而SingleOrDefault会迭代集合中所有的元素。
助记:有OrDefault的方法会返回值(如果没有符合条件的元素,则返回默认值),没有OrDefault的方法会抛出异常。
|
方法名 |
|
|
|
|
First() |
一条记录 |
返回没有,则异常 |
|
|
FirstOrDefault() |
一条记录 |
返回没有,默认值 |
|
|
Single() |
一个记录 |
返回没有,则异常 |
多条异常 |
|
SingleOrDefault() |
一个记录 |
返回没有,默认值 |
多条异常 |
优秀是一种习惯,欢迎大家关注学习

浙公网安备 33010602011771号