Visual Studio 2008因LINQ成功登顶企业级开发

原创
开发 后端
本文是Visual Studio进化史专题系列文章中,关于Visual Studio 2008的一篇。可以说VS 2008中最引人瞩目的是LINQ,是它让Visual Studio更优秀,更适合企业级开发工作。

【51CTO独家特稿】2010年4月12日是微软Visual Studio 2010正式版发布的日子。作为Visual Studio的用户,您是否还记得自己使用的***个Visual Studio版本?是否还记得CODE出***段代码时的兴奋?是否还记得那无数个寻找Bug的日日夜夜?51CTO开发频道带您一起走进Visual Studio历史,今天我们要介绍的是——Visual Studio 2008。

在.NET平台中,ADO.NET可以说从一定程序上对数据的数据处理增强了许多。主要功劳在于它把数据的操作和数据封装成对象来看待,这在很大程序上,使面向对象的程序员生活步入“天堂”。

但比起Java程序员来说,还是生活在“水深火热”之中,因为ADO.NET,只是把数据的操作当成对象,把查询出来的数据,封装在一个集合对象中,从业务逻辑的解度看,这其实是没有什么意义的,就是数据库中的数据,与我们应用程序中的业务对象没有关联。但Java体系中的Hibernate,它可以使数据对象化,所以这对于.NET程序员来说是望尘莫及的。

随着时间的推移,2008年,微软发布了Visual Studio 2008,其中有一项新技术LINQ(当然,LINQ不是在08年横空出世的,因为它是随Visual Studio 2008的版本诞生的),其实这个技术的概念并不新,就是可以把数据对象化,即所谓的实体类。虽然概念不新,但这个技术,对于.NET的程序员来说,给开发带来了不少的福音。也可以说LINQ使.NET的数据开发,迈上了一个新台阶,对企业级开发,提供了强有力的数据层的技术支持。

做个代码对比吧,好象这样更有说服力。

拿Northwind数据库作例子吧。

先看一下其中几个表的关系:

几个类

 

这里的Products表是依赖Categories表和Suppliers表,我们对Categories表进行增删改查。先看一下用ADO.NET来实现:

 

  1. class Program
  2. {
  3. string constr = "Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sa";
  4. static void Main(string[] args)
  5. {
  6. Program pro = new Program();
  7. pro.Change();
  8. pro.Query();
  9. }
  10. void Query()
  11. {
  12. string sql = "select categoryid,categoryname,description from categories";
  13. DataTable CategoriesDT = new DataTable();
  14. SqlDataAdapter DA = new SqlDataAdapter(sql, constr);
  15. DA.Fill(CategoriesDT);
  16. Console.WriteLine("-------------------ADONET--------------------------");
  17. foreach (DataRow dr in CategoriesDT.Rows)
  18. {
  19. Console.WriteLine("编号:" + dr["categoryid"].ToString());
  20. Console.WriteLine("名称:" + dr["categoryname"].ToString());
  21. Console.WriteLine("描述:" + dr["description"].ToString());
  22. Console.WriteLine("---------------------------------------------------");
  23. }
  24. }
  25. void Change()
  26. {
  27. string sql = "insert into categories(categoryname,description) values(@categoryname,@description)";
  28. SqlConnection con = new SqlConnection(constr);
  29. SqlCommand cmd = new SqlCommand(sql, con);
  30. cmd.Parameters.Clear();
  31. cmd.Parameters.Add("@categoryname", SqlDbType.NVarChar).Value = "A type";
  32. cmd.Parameters.Add("@description", SqlDbType.NText).Value = "this is a description";
  33. try
  34. {
  35. con.Open();
  36. cmd.ExecuteNonQuery();
  37. }
  38. catch (Exception e)
  39. {
  40. Console.WriteLine("出错:{0}", e.Message);
  41. }
  42. finally
  43. {
  44. con.Close();
  45. }
  46. }
  47. }

这里实现了查询和添加,如果做修改和删除只需要修改Change方法的中的SQL语句和相应的参数就可以了。

下面看一下LINQ To SQL来实现的代码(LINQ To SQL具体使用在这里不作说明,详情可查看MSDN相关文章):

 

  1. class Program
  2. {
  3. string constr = "Data Source=.;Initial Catalog=Northwind;Persist Security Info=True;User ID=sa;Password=sa";
  4. static void Main(string[] args)
  5. {
  6. Program pro = new Program();
  7. pro.Change();
  8. pro.Query();
  9. }
  10. void Query()
  11. {
  12. NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
  13. Table categories = northwindDC.GetTable();
  14. Console.WriteLine("---------------------LINQ--------------------------");
  15. foreach (Categories cate in categories)
  16. {
  17. Console.WriteLine("编号:{0}", cate.CategoryID);
  18. Console.WriteLine("名称:{0}", cate.CategoryName);
  19. Console.WriteLine("描述:{0}", cate.Description);
  20. Console.WriteLine("---------------------------------------------------");
  21. }
  22. }
  23. void Change()
  24. {
  25. //添加
  26. NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
  27. Categories cate = new Categories();
  28. cate.CategoryName = "MyType";
  29. cate.Description = "this is a LINQ description";
  30. northwindDC.Categories.InsertOnSubmit(cate);
  31. northwindDC.SubmitChanges();
  32. ////修改
  33. //NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
  34. //Table categories = northwindDC.GetTable();
  35. //Categories categ = categories.Single(cate => cate.CategoryID == 10);
  36. //categ.Description = "Change description where id equal 10";
  37. //northwindDC.SubmitChanges();
  38. ////删除
  39. //NorthwindDataContext northwindDC = new NorthwindDataContext(constr);
  40. //Table categories = northwindDC.GetTable();
  41. //categories.DeleteOnSubmit (categories .Single(cate => cate.CategoryID == 10));
  42. //northwindDC.SubmitChanges();
  43. }
  44. }

 

会看到,如果用ADO.NET去实现,我们能非常清晰的看到SQL语法的影子,并且是标准的T-SQL语句。其实在程序中出现SQL语句并不是什么大不了的事,很正常。那么让我们看看LINQ的实现方式:

 

  1. NorthwindDataContext northwindDC = new NorthwindDataContext(constr);

这行代码是用一个连接字符串作参数对象,这个对象我们看名字就可以明白,是代表数据库(当然这个名字是我们命名的,本身DataContext也是数据库的意思),也就是说,可以把对象notrthwindDC看成一个数据库本身。

  1. Categories cate = new Categories();  

这行代码也很好理解,是一个实体类实例化后的实体对象,cate在这里代表一个实体,在数据表中,表是存放数据的载体,并且是存放行相同类型数据记录的载体,每行记录,就是一个实体,在这里就是指完整的产品类型实体了。

 

  1. cate.CategoryName = "MyType";
  2. .Description = "this is a LINQ description";

给对象的属性赋值。

 

  1. northwindDC.Categories.InsertOnSubmit(cate);
  2. northwindDC.SubmitChanges();

然后把新产品类型实体添加到库对象的Categories(这里是多个产品类型实体的类型集合)对象中。

至于LINQ的修改删除,都是先找到准备的产品类型实体后进行操作。

通过ADO.NET和LINQ的代码,我们能看到,在LINQ的代码中,是找不到T-SQL语句的,我们操作的都是对象,或对象的集合,并且像LINQ中这样,给对象赋值,操作对象是很常见的,并且也是非常容易理解的,并且也能很好的与我们的业务对象溶为一体,使整个开发过程浑然一体,而不是在ADO.NET中那样,是通过操作数据库操作对象,和存放数据的对象来达到对数据的操作。尽管LINQ是封装了ADO.NET来达到这种效果的,运行效率上说不如ADO.NET,但LINQ的技术则会在我们开发习惯,留下更多的时间来弥补这个缺点。

其实LINQ的优点还表现在表间关系。在前面的图中,有表间关系,比如Products和Categories,是有一种关系的。同样在LINQ To SQL中,我们是可能表现到这种关系的。如果构建好了LINQ To SQL的类,则或以这样使用关系:

cate.Products

这是一个集合,可以调用Add方法,添加多个Products类型。

而每个Products实例对象,则只有一个Categories属性,只能赋一个Categories类型的值,在这里也体现出表的一(Categories)对多(Products)的关系了。

在这里说明一点,也是难于解决的一点,就是如果我们单从程序中看代码含意的时候,会被搞混的,看如下代码:

 

  1. Categories cate = new Categories();
  2. cate.Products
  3. Products produ = new Products();
  4. produ .Categories

 

cate的Products就是一个集合,而produ的Categories则是一个对象,按理produ.Categorie这样看起来更合适点,但Visual Studio 2008不能这样处理,因为它是按照数据的表名来生成类的属性的,所以这里就要分清,那个代表关系中的“一”,那个代表关系中的“多”。

LINQ To SQL仅仅是LINQ 的一部分,LINQ不但对数据进行对象操作,还可能对集合,数组,XML数据进行处理,使对数据的处理达到一种统一,这也是LINQ的功劳。

可以说,LINQ的出现,使VS成为更优秀,更合理的企业级开发工具。

作者简介

桂素伟,微软MVP,51CTO专家堂成员。微软中文技术论坛Visual C#、IT职业规划谈两个版块版主,微软WebCast讲师。精通C#,WinForm,ASP.NET,WPF,Windows Mobile等开发技术。山西DotNet俱乐部创始人之一,曾组织多次与微软合作组织活动,并多次组织山西DotNet俱乐部线上线下活动。

[[9856]]

 

 

【编辑推荐】

 

  1. Windows 7下Visual Studio 2008安装详解
  2. Visual Studio 2008中三大问题的解决方法
  3. 不能不知的VS2008技巧与便捷
  4. 对VS2008简介与日常使用
  5. 详细分析VS2008专业版相关功能
责任编辑:杨鹏飞 来源: 51CTO
相关推荐

2010-08-04 15:20:15

Flex企业级开发

2009-12-03 13:47:13

Microsoft V

2011-12-06 14:02:27

企业级移动开发

2012-05-15 15:21:29

企业级

2009-12-14 20:13:57

IBM

2010-02-23 10:39:43

Visual Stud

2009-12-16 15:44:20

Visual Stud

2009-12-18 13:39:40

Visual Stud

2009-12-17 15:38:21

Visual Stud

2009-06-23 14:55:43

AJAX和JSF

2013-08-01 00:00:00

开发企业级App出路

2009-06-23 15:02:56

JSF和AJAX

2017-03-21 10:22:09

移动开发

2013-12-08 21:16:21

BaaS企业级移动移动信息化

2017-08-28 08:56:34

IDE机器学习区块链

2013-05-29 14:54:49

Visual Stud

2009-07-01 17:11:32

标记导航Visual Stud

2009-12-16 14:51:27

Visual Stud

2009-12-14 15:46:38

visual stud

2009-07-01 17:15:25

ListView数据排Visual Stud
点赞
收藏

51CTO技术栈公众号