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、當集合中包含多個元素想拋出異常時,可以使用SingleSingleOrDefault。

    4、無論集合中是否有元素,我們都想要返回一個記錄時,可以使用FirstFirstOrDefault。

    5、當集合中不包含任何元素但需要返回默認值時,可以使用FirstOrDefault。

四、總結

    FirstSingle的區別:前者是TOP(1)后者是TOP(2),后者如果查詢到兩條數據則拋出異常。所以在必要的時候使用Single也不會比First慢多少。

    FirstOrDefaultSingleOrDefault的性能比較:

    FirstOrDefault通常在性能上會比SingleOrDefault表現得比優,因為FirstOrDefault是從集合開始位置查找到第一個匹配的元素就返回,而SingleOrDefault會迭代集合中所有的元素。

    助記:有OrDefault的方法會返回值(如果沒有符合條件的元素,則返回默認值),沒有OrDefault的方法會拋出異常。

方法名

 

 

 

First()

一條記錄

  返回沒有,則異常

 

FirstOrDefault()

一條記錄

  返回沒有,默認值

 

Single()

一個記錄

  返回沒有,則異常

多條異常

SingleOrDefault()

一個記錄

  返回沒有,默認值

多條異常

 

優秀是一種習慣,歡迎大家關注學習 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM