LINQ一般查詢到的結果是IEnumerable<T>集合類型,想要從中取出單一的元素,可以使用Single、First、Last、ElementAt等方法,以及它們帶有OrDefault的形式。
Single返回序列中的唯一元素,First、Last返回第一個、最后一個元素。
對比一下:
方法 | 序列為null時 | 序列不包含任何元素時 | 序列只包含一個元素時 | 序列包含多個元素時 |
Single | 引發異常 | 引發異常 | 返回該元素 | 引發異常 |
SingleOrDefault | 引發異常 | 返回default(TSource) | 返回該元素 | 引發異常 |
First | 引發異常 | 引發異常 | 返回該元素 | 返回第一個元素 |
FirstOrDefault | 引發異常 | 返回default(TSource) | 返回該元素 | 返回第一個元素 |
Last | 引發異常 | 引發異常 | 返回該元素 | 返回最后一個元素 |
LastOrDefault | 引發異常 | 返回default(TSource) | 返回該元素 | 返回最后一個元素 |
Single、SingleOrDefault可以用來確保序列中不存在多個元素。
SingleOrDefault可以用來檢驗序列中是否包含有元素。引用類型的默認值default(T)為null,表示在序列中沒有找到元素。
下面來看一下Single、SingleOrDefault的實際使用。
1、用戶登錄:
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做進一步判斷處理。
2、將用戶表綁定到DataGrid后,單選一個用戶:
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取出用戶就不會有問題了。