LINQ to SQL
其实绝大部分的程序都是在跟数据打交道,然而目前的情景是,程序员编写代码调用数据库提供的接口对数据进行操作,至于数据库内部是如何进行操作的,不得而知,程序员只是传递给数据库一些文本命令,数据库对其进行解析并作出相应的反应,这样的做法存在着明显的缺陷,例如程序员无法实现编译时验证并且也无法获得编写代码时的智能感知功能。并且,编程语言和数据库之间也存在着很大的差异,现在的高级编程语言都以对象的形式来建立数据模型,对象用属性来保存数据,用方法来操作数据,而关系型数据库中则是以表的形式来保存数据,以存储过程来操作数据。对象和行之间的差别是显而易见的,那么如何来跨越这条鸿沟了,这正是LINQ to SQL要做的事情。
LINQ to SQL为用对象的形式来管理关系型数据并对其进行查询提供了基础,它将语言集成查询翻译成SQL语句并从数据库中返回查询结果给开发人员定义的对象,然后应用程序可以很方便地操作该对象,此时LINQ to SQL则在后台自动跟踪其变化。LINQ也支持表与表之间的关系以及存储过程,这使得它与现有的应用程序可以很好地兼容。
好吧,现在我们就来实际动手开始一个LINQ to SQL的项目吧。
我们首先新建一个项目,为方便起见,就新建Console项目了,然后添加一个“LINQ to SQL Classes”,大家就会看到如下的界面:
图1,新建LINQ to SQL Classes
我们新建的这个是DemoDataClass.cs,大家可以看到创建好这个文件后有两个子窗口,左边这个是数据区,右边的是方法区,也就是说我们可以把数据库中的表拖放到左边的区域中,把存储过程拖放到右边的区域中去。
图2,拖放数据库表及存储过程
接下来我们把数据库中的两个表(T_School和T_Student)及一个存储过程(KickOutAllFailedStudent)拖放到了相应的区域中,并且表之间的外键关系也自动被添加进来了,接下来我们来看看如何使用这个数据类呢。
接下来我们就来写段代码看看如何操作吧:
1: static void Main(string[] args)
2: {
3: DemoDataClassDataContext demoData = new DemoDataClassDataContext();
4: var students = demoData.T_Students.Select(student => student);
5:
6: foreach (var student in students)
7: {
8: Console.WriteLine(student.Name);
9: }
10:
11: Console.ReadLine();
12: }
很明显,这段代码要做的事情就是从T_Student表中获得所有学生的信息并打印出他们的名字,至于查询语句与Lambda表达式的内容,这里不再着重介绍,不熟悉的朋友请参阅《C# 3.0探索之旅》。
图3,获取并打印所有学生名字
这就是一个很简单的LINQ to SQL应用,刚才我们还提到了存储过程,例如我们这个例子里面就有一个名为KickOutAllFailedStudent的存储过程,它的任务就是删除所有成绩全部不及格的学生(就相当于开除或勒令转学),在这里,这个存储过程变成了demoData对象中的一个方法,我们可以直接通过该对象来调用它。
这样的形式有很明显的好处,过去我们需要在程序中操作数据库的时候必须很清楚地了解数据库的表结构以及数据类型等,而现在,结合隐式类型变量,我们并不需要非常清楚地了解数据库里面是怎么设计的,而是只要知道它有些什么数据就可以做我们想做的事情了。以后我们是不是可以找专长于数据库的人来维护数据库,而开发人员可以把精力集中在应用程序的开发上了,从而让分工更加明细,实的工作效率更高呢?我在这里只给出一个简单的应用,希望能起到抛砖引玉的效果,LINQ是一项新生事物,它到底能给我们带来多少好处和便利以及能为我们做多少事情,我们现在还说不清楚,不同的应用方式与效果需要大家伙儿一起在日常的工作和学习中去总结和发掘,尽管性能相比传统的数据查询方式会低许多(接下来我们会专门探讨性能问题),但它给我们带来的方便快捷的开发体验在某些领域完全可以让我们用性能来换取,好了,今天就介绍到这里吧,接下来是LINQ to XML,敬请关注!