Visual Studio 2008因LINQ成功登頂企業(yè)級開發(fā)
原創(chuàng)【51CTO獨家特稿】2010年4月12日是微軟Visual Studio 2010正式版發(fā)布的日子。作為Visual Studio的用戶,您是否還記得自己使用的***個Visual Studio版本?是否還記得CODE出***段代碼時的興奮?是否還記得那無數(shù)個尋找Bug的日日夜夜?51CTO開發(fā)頻道帶您一起走進Visual Studio歷史,今天我們要介紹的是——Visual Studio 2008。
在.NET平臺中,ADO.NET可以說從一定程序上對數(shù)據(jù)的數(shù)據(jù)處理增強了許多。主要功勞在于它把數(shù)據(jù)的操作和數(shù)據(jù)封裝成對象來看待,這在很大程序上,使面向?qū)ο蟮某绦騿T生活步入“天堂”。
但比起Java程序員來說,還是生活在“水深火熱”之中,因為ADO.NET,只是把數(shù)據(jù)的操作當成對象,把查詢出來的數(shù)據(jù),封裝在一個集合對象中,從業(yè)務邏輯的解度看,這其實是沒有什么意義的,就是數(shù)據(jù)庫中的數(shù)據(jù),與我們應用程序中的業(yè)務對象沒有關(guān)聯(lián)。但Java體系中的Hibernate,它可以使數(shù)據(jù)對象化,所以這對于.NET程序員來說是望塵莫及的。
隨著時間的推移,2008年,微軟發(fā)布了Visual Studio 2008,其中有一項新技術(shù)LINQ(當然,LINQ不是在08年橫空出世的,因為它是隨Visual Studio 2008的版本誕生的),其實這個技術(shù)的概念并不新,就是可以把數(shù)據(jù)對象化,即所謂的實體類。雖然概念不新,但這個技術(shù),對于.NET的程序員來說,給開發(fā)帶來了不少的福音。也可以說LINQ使.NET的數(shù)據(jù)開發(fā),邁上了一個新臺階,對企業(yè)級開發(fā),提供了強有力的數(shù)據(jù)層的技術(shù)支持。
做個代碼對比吧,好象這樣更有說服力。
拿Northwind數(shù)據(jù)庫作例子吧。
先看一下其中幾個表的關(guān)系:
這里的Products表是依賴Categories表和Suppliers表,我們對Categories表進行增刪改查。先看一下用ADO.NET來實現(xiàn):
- class Program
- {
- string constr = "Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sa";
- static void Main(string[] args)
- {
- Program pro = new Program();
- pro.Change();
- pro.Query();
- }
- void Query()
- {
- string sql = "select categoryid,categoryname,description from categories";
- DataTable CategoriesDT = new DataTable();
- SqlDataAdapter DA = new SqlDataAdapter(sql, constr);
- DA.Fill(CategoriesDT);
- Console.WriteLine("-------------------ADONET--------------------------");
- foreach (DataRow dr in CategoriesDT.Rows)
- {
- Console.WriteLine("編號:" + dr["categoryid"].ToString());
- Console.WriteLine("名稱:" + dr["categoryname"].ToString());
- Console.WriteLine("描述:" + dr["description"].ToString());
- Console.WriteLine("---------------------------------------------------");
- }
- }
- void Change()
- {
- string sql = "insert into categories(categoryname,description) values(@categoryname,@description)";
- SqlConnection con = new SqlConnection(constr);
- SqlCommand cmd = new SqlCommand(sql, con);
- cmd.Parameters.Clear();
- cmd.Parameters.Add("@categoryname", SqlDbType.NVarChar).Value = "A type";
- cmd.Parameters.Add("@description", SqlDbType.NText).Value = "this is a description";
- try
- {
- con.Open();
- cmd.ExecuteNonQuery();
- }
- catch (Exception e)
- {
- Console.WriteLine("出錯:{0}", e.Message);
- }
- finally
- {
- con.Close();
- }
- }
- }
這里實現(xiàn)了查詢和添加,如果做修改和刪除只需要修改Change方法的中的SQL語句和相應的參數(shù)就可以了。
下面看一下LINQ To SQL來實現(xiàn)的代碼(LINQ To SQL具體使用在這里不作說明,詳情可查看MSDN相關(guān)文章):
- class Program
- {
- string constr = "Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sa";
- static void Main(string[] args)
- {
- Program pro = new Program();
- pro.Change();
- pro.Query();
- }
- void Query()
- {
- NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
- Table categories = northwindDC.GetTable();
- Console.WriteLine("---------------------LINQ--------------------------");
- foreach (Categories cate in categories)
- {
- Console.WriteLine("編號:{0}", cate.CategoryID);
- Console.WriteLine("名稱:{0}", cate.CategoryName);
- Console.WriteLine("描述:{0}", cate.Description);
- Console.WriteLine("---------------------------------------------------");
- }
- }
- void Change()
- {
- //添加
- NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
- Categories cate = new Categories();
- cate.CategoryName = "MyType";
- cate.Description = "this is a LINQ description";
- northwindDC.Categories.InsertOnSubmit(cate);
- northwindDC.SubmitChanges();
- ////修改
- //NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
- //Table categories = northwindDC.GetTable();
- //Categories categ = categories.Single(cate => cate.CategoryID == 10);
- //categ.Description = "Change description where id equal 10";
- //northwindDC.SubmitChanges();
- ////刪除
- //NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
- //Table categories = northwindDC.GetTable();
- //categories.DeleteOnSubmit (categories .Single(cate => cate.CategoryID == 10));
- //northwindDC.SubmitChanges();
- }
- }
會看到,如果用ADO.NET去實現(xiàn),我們能非常清晰的看到SQL語法的影子,并且是標準的T-SQL語句。其實在程序中出現(xiàn)SQL語句并不是什么大不了的事,很正常。那么讓我們看看LINQ的實現(xiàn)方式:
- NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
這行代碼是用一個連接字符串作參數(shù)對象,這個對象我們看名字就可以明白,是代表數(shù)據(jù)庫(當然這個名字是我們命名的,本身DataContext也是數(shù)據(jù)庫的意思),也就是說,可以把對象notrthwindDC看成一個數(shù)據(jù)庫本身。
- Categories cate = new Categories();
這行代碼也很好理解,是一個實體類實例化后的實體對象,cate在這里代表一個實體,在數(shù)據(jù)表中,表是存放數(shù)據(jù)的載體,并且是存放行相同類型數(shù)據(jù)記錄的載體,每行記錄,就是一個實體,在這里就是指完整的產(chǎn)品類型實體了。
- cate.CategoryName = "MyType";
- .Description = "this is a LINQ description";
給對象的屬性賦值。
- northwindDC.Categories.InsertOnSubmit(cate);
- northwindDC.SubmitChanges();
然后把新產(chǎn)品類型實體添加到庫對象的Categories(這里是多個產(chǎn)品類型實體的類型集合)對象中。
至于LINQ的修改刪除,都是先找到準備的產(chǎn)品類型實體后進行操作。
通過ADO.NET和LINQ的代碼,我們能看到,在LINQ的代碼中,是找不到T-SQL語句的,我們操作的都是對象,或?qū)ο蟮募希⑶蚁馤INQ中這樣,給對象賦值,操作對象是很常見的,并且也是非常容易理解的,并且也能很好的與我們的業(yè)務對象溶為一體,使整個開發(fā)過程渾然一體,而不是在ADO.NET中那樣,是通過操作數(shù)據(jù)庫操作對象,和存放數(shù)據(jù)的對象來達到對數(shù)據(jù)的操作。盡管LINQ是封裝了ADO.NET來達到這種效果的,運行效率上說不如ADO.NET,但LINQ的技術(shù)則會在我們開發(fā)習慣,留下更多的時間來彌補這個缺點。
其實LINQ的優(yōu)點還表現(xiàn)在表間關(guān)系。在前面的圖中,有表間關(guān)系,比如Products和Categories,是有一種關(guān)系的。同樣在LINQ To SQL中,我們是可能表現(xiàn)到這種關(guān)系的。如果構(gòu)建好了LINQ To SQL的類,則或以這樣使用關(guān)系:
cate.Products
這是一個集合,可以調(diào)用Add方法,添加多個Products類型。
而每個Products實例對象,則只有一個Categories屬性,只能賦一個Categories類型的值,在這里也體現(xiàn)出表的一(Categories)對多(Products)的關(guān)系了。
在這里說明一點,也是難于解決的一點,就是如果我們單從程序中看代碼含意的時候,會被搞混的,看如下代碼:
- Categories cate = new Categories();
- cate.Products
- Products produ = new Products();
- produ .Categories
cate的Products就是一個集合,而produ的Categories則是一個對象,按理produ.Categorie這樣看起來更合適點,但Visual Studio 2008不能這樣處理,因為它是按照數(shù)據(jù)的表名來生成類的屬性的,所以這里就要分清,那個代表關(guān)系中的“一”,那個代表關(guān)系中的“多”。
LINQ To SQL僅僅是LINQ 的一部分,LINQ不但對數(shù)據(jù)進行對象操作,還可能對集合,數(shù)組,XML數(shù)據(jù)進行處理,使對數(shù)據(jù)的處理達到一種統(tǒng)一,這也是LINQ的功勞。
可以說,LINQ的出現(xiàn),使VS成為更優(yōu)秀,更合理的企業(yè)級開發(fā)工具。
作者簡介
桂素偉,微軟MVP,51CTO專家堂成員。微軟中文技術(shù)論壇Visual C#、IT職業(yè)規(guī)劃談兩個版塊版主,微軟WebCast講師。精通C#,WinForm,ASP.NET,WPF,Windows Mobile等開發(fā)技術(shù)。山西DotNet俱樂部創(chuàng)始人之一,曾組織多次與微軟合作組織活動,并多次組織山西DotNet俱樂部線上線下活動。
【編輯推薦】