LINQ下使用三层架构的探索(二)建立一个LTS层,并在表示层中查询数据
关于三层架构的优点我就不多说了,开门见山,我们直接开始我们的工作。
按部就班地做
1打开VS2008,新建一个站点,直接将提供的Northwind数据库拷贝到App_Data中。
在根目录按右键,Add new item,然后选择LINQ to SQL classes,选择C#语言,重命名为Northwind.dbml。
2 点击Server Explorer 选项卡,打开NORTHWIND.MDF节点,将tables中的表Categories和表Products拖入Northwind.dbml中。
3 点击窗口中的空白处,切换到Properties 选项卡,注意到这个DataContext的名字为NorthwindDataContext,之后我们要使用到该对象创建实例。点击到Products表,注意到他的名字为Products,Source属性为dbo.Products。
4 注意到Solution Explorer中的Northwind.dbml有个cs类文件,我们可以看一下他的内容,仔细看可以理解他的工作原理,但是我们现在不深入讨论这些东西。
5 这一张我们先不添加包含LINQ语法的逻辑访问层,而直接通过表示层和一些LINQ语句来使用表中的数据。所以我们新建一个WEB窗体,添加一个GridView,双击空白处,进入PageLoad事件,让我们添加如下代码:
var product = from p in db.Products
select p;
GridView1.DataSource=product;
GridView1.DataBind();
6 简单的解释一下这些代码:
1) 我们创建了一个DataContext实例 db
2) 我们使用了一个新的var关键字,告诉编译器,让它判断值的类型。(但是既然让编译器推断类型就必须声明的时候赋值,而且不能是null值。注意,这只能用于局部变量,用于字段是不可以的)
3) 我们选择了db中的Products,其实这就是表Products对象化后的结果(关于LINQ语法这里先不讲)
4) 其实最后product的类型应该就是IQueryable,该类型位于System.Linq中。该类型可以直接作为DataSource使用。
5) 使用product作为GridView1的数据源,然后绑定。
7 然后运行该页面,将看到Product表中的所有记录。
它是如何工作的?
我们做的工作非常少,我们仅仅是建立了一个LINQ TO SQL 类,并且将数据库中的表拖入其中(还可以把视图和存储过程添加进去)。之后,VS2008自动生成了一系列的代码,我们不详细介绍这些代码,但是我们知道,LTS层将数据转换成了对象,我们可以如同操作对象一样操作数据。
不过我的做法并没有将操作这些对象的方法写在LTS层中(其实也能这么做),因此在这章立,我们在表示层中使用了这些操作方法,称之为LINQ语法,看上去很像SQL的查询语法。在编译的时候,LINQ会将它们翻译成SQL语法然后根据相对应的对象去操作数据库。
小结:
做到这里,也许有人觉得,我没有把操作方法传统地放在底层有些不太符合三层架构的思想。但是我个人认为,即便是在表示层去完成这些操作方法,也并没有违反“不在表示层中有操作数据库的语句”。因为实际上,我们并没有去操作数据实体,而是操作对象,接着LINQ会帮我们把这些操作应用在数据上。
不过,即便是这样,我觉得在表示层中来实现对象的操作方法也是欠妥当的,不过这一章我们着重讲得是LTS的建立,为了快速得到我们的结果,才采取了这样的方法,在下一章中我们会学习到使用逻辑访问层去编写这些方法。而在表示层中我们直接调用这些方法就可以了。
关于LINQ语句的使用大家可以参考李永京的博客中的一些文章,有比较详细的介绍,我这里主要讲层的设计,就不详细说了。感觉其实和SQL很像,只不过更加面向对象化了。
这里有几句不同的查询,大家可以替换刚才例子中的LINQ语句。
查看已经停用的记录
where p.Discontinued==true
select p;
查看供应商名字为Produce的记录
where p.Category.CategoryName =="Produce"
select p;
由于LINQ将表之间的关系也对象化了,因此我们可以直接使用p.Category.XXXX来表示Category表中的字段值。
好了,第一章的内容应该比较容易消化。
祝,编程愉快!