學習Linq經(jīng)驗總結
Linq有很多值得學習的地方,這里我們主要介紹學習Linq,包括介紹Linq目標是實現(xiàn)語言與數(shù)據(jù)的深度結合等方面。
上一個系列講了C#3.0的新特性,為學習Linq做好了鋪墊;接下來的一段時間轉入學習Linq,上述新特性也會在介紹的過程中提及到。
學習Linq
在我們的軟件中,數(shù)據(jù)的重要性不可言喻,特別是象ERP,CRM等等這類商業(yè)應用軟件就是圍繞著數(shù)據(jù)轉;然而數(shù)據(jù)的來源各種各樣,如存放在內(nèi)存中的業(yè)務對象、存放在xml文件的數(shù)據(jù)、SqlServer關系數(shù)據(jù)庫...這些數(shù)據(jù)源的讀取操作各不相同,相互之間的轉換也不是那么容易;為此VS.Net提供了各種技術來支持這些數(shù)據(jù)源的操作,如操作數(shù)據(jù)庫的ADO.Net,操作xml文件的API(XmlDocument, XmlReader, XPathNavigator等),以及一些存放在內(nèi)存中的數(shù)據(jù)的操作(數(shù)組,參數(shù)變量,類,泛型等等);如今在C#3.0中提供了一種新技術來整合處理各種數(shù)據(jù)操作的問題,這就是Linq;
Linq目標是實現(xiàn)語言與數(shù)據(jù)的深度結合,Linq以統(tǒng)一的數(shù)據(jù)訪問方式訪問各種數(shù)據(jù)源,以相同的方式讀取數(shù)據(jù),象SQL語句一樣進行查詢,而這些都是整合在我們熟悉的編程語言如C#,VB當中,另外Linq是使用強類型,并提供編譯時檢查和VS的智能感知特性等。
下面我們以SQLServer為數(shù)據(jù)源,列舉一段代碼分析一下:
- // ADO.NET中我們會用它提供的SqlConnection, SqlCommand,
 
SqlDataAdapter,SqlReader, DataSet, 和 DataTable等來訪問操作數(shù)據(jù)庫 ;- //使用SqlDataAdapter填充DataSet
 - using (SqlConnection conn = new SqlConnection(""))
 - {
 - DataSet ds = new DataSet();
 - SqlDataAdapter da = new SqlDataAdapter("SELECT * FROM Customers", conn);
 - da.Fill(ds);
 - }
 - //使用SqlDataReader讀取數(shù)據(jù)
 - using (SqlConnection connection = new SqlConnection(""))
 - {
 - connection.Open();
 - SqlCommand command = connection.CreateCommand();
 - command.CommandText = @"SELECT Name, Country FROM Customers WHERE City = @City";
 - command.Parameters.AddWithValue("@City", "Paris");
 - using (SqlDataReader reader = command.ExecuteReader())
 - {
 - while (reader.Read())
 - {
 - string name = reader.GetString(0);
 - string country = reader.GetString(1);
 - }
 - }
 - }
 
這段代碼中,我們只是一個簡單的數(shù)據(jù)讀取,不管是使用SqlDataAdapter還是SqlDataReader都會碰到一些問題:
1.如果直接在代碼里寫語句,不能確保語句的正確性,連基本的SQL語句的關鍵字也不能保證是否書寫正確;而在Linq中把一些常用的關鍵字如Select、from、where等寫成擴展方法,確保在編譯時提供語句的驗證;
2.查詢時使用的參數(shù),和查詢返回的結果都是弱類型,而在我們面向對象編程中希望能使用強類型來確保我們程序的正確,這樣就需要很多的輔助判斷來確保我們傳入的參數(shù)和得到的結果是符合相應的類型要求;而我們在Linq使用的都是強類型,可以避免這些多余的判斷,確保程序能得到編譯器的驗證,不會等到運行時才捕獲到錯誤;
3.***的問題是,這段代碼只適合SQLServer使用,如果使用其它數(shù)據(jù)庫(Oracle,MySQL...),或者其它數(shù)據(jù)源(xml,文本文件...)就會改動較大,或者重新寫方法才能使用,而使用Linq可以有效避免這些問題。以上是學習Linq。
【編輯推薦】















 
 
 
 
 
 
 