在使用EntityFramework開發時,.NET的System.Linq.Enumerable類爲咱們提供了許多Linq方法。性能
給你們分享一下關於First、FirstOrDefault、Single、SingleOrDefault幾個方法的區別實例及使用場景,首先是關於這幾個方法的定義:學習
● First:返回序列中的第一條記錄,若是沒有記錄,則引起異常。spa
● FirstOrDefault:返回序列中的第一條記錄,若是沒有記錄,則返回默認值。3d
● Single:返回序列中的惟一記錄,若是沒有或返回多條記錄,則引起異常。code
● SingleOrDefault:返回序列中的惟一記錄;若是該序列爲空,則返回默認值;若是該序列包含多個元素,則引起異常。對象
◆ 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返回序列中的惟一一條記錄,若是沒有或返回多條,則引起異常,示例代碼以下:
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); } }
結果以下圖所示:
一、當集合中只有一個元素時,可使用Single。
二、當集合中不包含任何元素但須要返回默認值時,可使用SingleOrDefault。
三、當集合中包含多個元素並想拋出異常時,可使用Single或SingleOrDefault。
四、不管集合中是否有元素,咱們都想要返回一個記錄時,可使用First或FirstOrDefault。
五、當集合中不包含任何元素但須要返回默認值時,可使用FirstOrDefault。
First和Single的區別:前者是TOP(1)後者是TOP(2),後者若是查詢到兩條數據則拋出異常。因此在必要的時候使用Single也不會比First慢多少。
FirstOrDefault與SingleOrDefault的性能比較:
FirstOrDefault一般在性能上會比SingleOrDefault表現得比優,由於FirstOrDefault是從集合開始位置查找到第一個匹配的元素就返回,而SingleOrDefault會迭代集合中全部的元素。
助記:有OrDefault的方法會返回值(若是沒有符合條件的元素,則返回默認值),沒有OrDefault的方法會拋出異常。
方法名 |
|
|
|
First() |
一條記錄 |
返回沒有,則異常 |
|
FirstOrDefault() |
一條記錄 |
返回沒有,默認值 |
|
Single() |
一個記錄 |
返回沒有,則異常 |
多條異常 |
SingleOrDefault() |
一個記錄 |
返回沒有,默認值 |
多條異常 |
優秀是一種習慣,歡迎你們關注學習