详细介绍Linq to SQL

开发 后端
这里介绍这一篇介绍Linq to SQL,如果你已经对Linq to SQL有使用经验或者你觉得我说的有地方有错误,有误导大家的嫌疑,烦请不要吝啬你的memory和CPU给我写个评语,我将不胜感激。

在向大家详细介绍Linq to SQL之前,首先让大家了解下Linq to SQL的核心库,下文全面介绍Linq to SQL。

Linq to SQL的核心库是System.Data.Linq.dll(位于C:"Program Files"Reference Assemblies"Microsoft"Framework"v3.5目录下),不过,System.Core.dll里的System.Linq是整个Linq的核心。在System.Data.Linq.dll里System.Data.Linq命名空间下的DataContext类是Linq to SQL的入口点,可以说Linq to SQL一切奇妙之处都来源如此。通过DataContxt我们可以获取Table对象(这个类和DataContext在同一命名空间下),你会发现Table竟然是继承自IEnumerable,那上一篇介绍的那些查询表达式都可以应用在Table对象上了,呵呵。

有过使用ORM框架的读者肯定知道,一般ORM框架都有个映射,就是将内存中的对象和数据库表做映射,大名鼎鼎的NHibernate是使用XML文件做映射的(我们一般将这种映射称之为无入侵的),还有ActiveRecord模式一般式在属性上加Attribute做映射的(一般称之为侵入式的)。Linq to SQL也不例外,也需要一个映射,她使用的是侵入式的,所以就需要一些Attribute,这些Attribute放在System.Data.Linq.Mapping命名空间下。

作为微软大张旗鼓推出的ORM,Linq to SQL目前却支持Sql Server,这个未免有些遗憾(所幸的是对于其他几种数据库已经有开源实现了),不过放心,看看核心库里面的命名空间你也许看到了曙光。在System.Data.Linq.dll还有两个命名空间:

System.Data.Linq.Provider,这个命名空间是提供一些Provider模式的接口,由于不同数据库所需要的SQL语句,一些函数都有一些不同,但是她们的操作却都大同小异,所以我们可以抽象一个统一的接口,然后有各个数据库的实现(非常奇怪微软为啥将IProvider接口设置为internal的,难道他只想他自己一个人干?)。System.Data.Linq.SqlClient命名空间里放的就是针对Sql Server的实现了,按照这个结构,支持所有的数据库都是可以的。

好了,上面对Linq to SQL的一些组件做了一个大致的介绍,下面就稍微演示一段代码。

要做一个Linq to SQL的case,首先你必须创建一个映射类,该类映射到数据库表。实际上映射类和我们在上一篇所使用的实体类非常相似(确保对System.Data.Linq.dll的引用,并且对System.Data.Linq.Mapping命名空间的声明):

  1. [Table(Name="Users")]  
  2. public class User  
  3. {  
  4. [Column(IsPrimaryKey=true)]  
  5. public int UserId { get; set; }  
  6. [Column]  
  7. public string UserName { get; set; }  
  8. [Column]  
  9. public string Password { get; set; }  
  10. [Column]  
  11. public string BlogName { get; set; }  
  12. [Column]  
  13. public Role Role { get; set; }  

(看到这里你也许会命名什么叫入侵式了吧,入侵式就是为了达到目的,对代码做了一些改变,比如这里的Table,Column)

User类上面加的Table表示这个类和一个表映射,表名为Users,注意,如果表名和类名是一样的,这个Name属性是无需指定的,在属性或共有字段上加Column表示这个属性和数据库表里的字段映射,如果属性名和数据库表字段名一直只需要加个Column就够了,如果这个属性在数据库表里是个主键,那么将其IsPrimaryKey设置为true就可以了。

映射建好了,该是Linq上场的时候了(我们要从数据库表里查询出用户名以”yu”开头的所有用户):

  1. //我们给定一个数据库连接字符串实例化一个DataContext对象  
  2. DataContext dbContext = new DataContext(connectionString);  
  3.  
  4. dbContext.Log = Console.Out;  
  5. //调用DataContext的GetTable方法,获取一个Table对象  
  6. Table<User> users = dbContext.GetTable<User>();  
  7. //由于Table继承自IEnumerable,所以,前面所介绍的那些查询表达式在这里也使用了  
  8. var result = from user in users  
  9. where user.UserName.StartsWith("yu")  
  10. select user;  
  11.  
  12. //遍历结果集  
  13. foreach (var u in result)  
  14. Console.WriteLine(u.UserName); 

很妙吧,没有了以前重复又重复的DbCommand,DbConnection代码,好像C#直接面向数据库一样。

在上面的代码里还有一行特殊的代码:dbContext.Log = Console.Out;,它会将你的C#查询表达式最后产生的SQL语句输出来,这样就更方便你调试和优化了。

本篇只是对Linq to SQL做一个大致的介绍,使大家对Linq to SQL有个全面的感性认识,在下一节会用大量的实例介绍Linq to SQL的方方面面。

这一篇介绍Linq to SQL,如果你已经对Linq to SQL有使用经验或者你觉得我说的有地方有错误,有误导大家的嫌疑,烦请不要吝啬你的memory和CPU给我写个评语,我将不胜感激。

【编辑推荐】

  1. LINQ查询操作经验总结
  2. LINQ遍历多个数组深入剖析
  3. Linq查询Access数据文件浅谈
  4. LINQ构建框架设计学习笔记
  5. LINQ重要组成部分简介
责任编辑:佚名 来源: 网易博客
相关推荐

2009-09-18 09:25:06

LINQ Framew

2009-09-15 13:20:34

LINQ DataCo

2009-09-14 14:17:11

Linq异常处理

2009-09-11 09:41:19

LINQ to SQL

2009-09-17 10:40:22

Linq Lambda

2009-09-07 16:13:14

LINQ to SQL

2009-09-14 15:15:45

LINQ技术

2009-09-15 13:59:18

LINQ to Dat

2009-09-14 14:20:36

LINQ ORM

2009-09-09 14:20:49

LINQ To Luc

2009-09-10 17:30:15

LINQ Where子

2009-09-16 10:38:43

LINQ查询

2009-09-08 10:50:20

2009-08-13 11:01:32

LINQPadLINQ工具

2009-09-14 14:58:52

LINQ to XML

2009-09-14 13:14:49

LINQ序列

2009-09-17 13:10:48

linq动态排序

2009-09-14 16:33:55

LINQ To XML

2023-03-31 14:15:57

SQLORDER BY

2009-09-08 14:45:24

Linq to SQL支持SQL Serve
点赞
收藏

51CTO技术栈公众号