EF中使用Linq时First、FirstOrDefault、Single、SingleOrDefault几个方法的区别

1、前言

    在使用EntityFramework开发时,.NET的System.Linq.Enumerable类为咱们提供了许多Linq方法。性能

    给你们分享一下关于First、FirstOrDefault、Single、SingleOrDefault几个方法的区别实例及使用场景,首先是关于这几个方法的定义:学习

    ● First:返回序列中的第一条记录,若是没有记录,则引起异常。spa

    ● FirstOrDefault:返回序列中的第一条记录,若是没有记录,则返回默认值。3d

    ● Single:返回序列中的惟一记录,若是没有或返回多条记录,则引起异常。code

    ● SingleOrDefault:返回序列中的惟一记录;若是该序列为空,则返回默认值;若是该序列包含多个元素,则引起异常。对象

2、实例和用法

一、First与FirstOrDefault

    ◆ First返回序列中的第一条记录,若是没有记录,则引起异常,示例代码以下:blog

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);
       }
}

    结果以下图所示:ci

 

    ◆ 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);
}

    结果以下图所示:string

 

二、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);
         }
}

    结果以下图所示:

 

3、何时用First、FristOrDefault、Single、SingleOrDefault?

    一、当集合中只有一个元素时,可使用Single

    二、当集合中不包含任何元素但须要返回默认值时,可使用SingleOrDefault。

    三、当集合中包含多个元素想抛出异常时,可使用SingleSingleOrDefault。

    四、不管集合中是否有元素,咱们都想要返回一个记录时,可使用FirstFirstOrDefault。

    五、当集合中不包含任何元素但须要返回默认值时,可使用FirstOrDefault。

4、总结

    FirstSingle的区别:前者是TOP(1)后者是TOP(2),后者若是查询到两条数据则抛出异常。因此在必要的时候使用Single也不会比First慢多少。

    FirstOrDefaultSingleOrDefault的性能比较:

    FirstOrDefault一般在性能上会比SingleOrDefault表现得比优,由于FirstOrDefault是从集合开始位置查找到第一个匹配的元素就返回,而SingleOrDefault会迭代集合中全部的元素。

    助记:有OrDefault的方法会返回值(若是没有符合条件的元素,则返回默认值),没有OrDefault的方法会抛出异常。

方法名

 

 

 

First()

一条记录

  返回没有,则异常

 

FirstOrDefault()

一条记录

  返回没有,默认值

 

Single()

一个记录

  返回没有,则异常

多条异常

SingleOrDefault()

一个记录

  返回没有,默认值

多条异常

 

优秀是一种习惯,欢迎你们关注学习 

相关文章
相关标签/搜索