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()

一個記錄

  返回沒有,默認值

多條異常

 

優秀是一種習慣,歡迎你們關注學習 

相關文章
相關標籤/搜索