LINQ中,Single()、SingleOrDefault()的解析、示例

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

相關文章
相關標籤/搜索