LINQ通常查詢到的結果是IEnumerable<T>集合類型,想要從中取出單一的元素,能夠使用Single、First、Last、ElementAt等方法,以及它們帶有OrDefault的形式。sql
Single返回序列中的惟一元素,First、Last返回第一個、最後一個元素。spa
對比一下:code
方法 | 序列爲null時 | 序列不包含任何元素時 | 序列只包含一個元素時 | 序列包含多個元素時 |
Single | 引起異常 | 引起異常 | 返回該元素 | 引起異常 |
SingleOrDefault | 引起異常 | 返回default(TSource) | 返回該元素 | 引起異常 |
First | 引起異常 | 引起異常 | 返回該元素 | 返回第一個元素 |
FirstOrDefault | 引起異常 | 返回default(TSource) | 返回該元素 | 返回第一個元素 |
Last | 引起異常 | 引起異常 | 返回該元素 | 返回最後一個元素 |
LastOrDefault | 引起異常 | 返回default(TSource) | 返回該元素 | 返回最後一個元素 |
Single、SingleOrDefault能夠用來確保序列中不存在多個元素。blog
SingleOrDefault能夠用來檢驗序列中是否包含有元素。引用類型的默認值default(T)爲null,表示在序列中沒有找到元素。string
下面來看一下Single、SingleOrDefault的實際使用。it
一、用戶登陸:io
public static User QueryUser(string code, string password) { using (SQLiteConnection conn = new SQLiteConnection(connectionString)) { string sql = "select * from User where Code = @Code and Password = @Password"; var param = new { Code = code, Password = password }; return conn.Query<User>(sql, param).SingleOrDefault(); } }
在用戶表中,Code是惟一的,若是查詢出多個知足條件的用戶,要拋異常;若是沒有查詢到用戶,返回null作進一步判斷處理。table
二、將用戶表綁定到DataGrid後,單選一個用戶:ast
IEnumerable<User> query = (dataGrid.ItemsSource as IEnumerable<User>) .Where(user => user.IsChecked); if (query.Count() == 0) { MessageBox.Show("沒有選中"); return; } if (query.Count() > 1) { MessageBox.Show("不能多選"); return; } User user = query.Single();
由於在以前判斷過序列的元素數量,因此調用Single取出用戶就不會有問題了。class