走进Linq-Linq to SQL How do I(2)
2008-08-05 11:07
417 查看
本篇是Linq to SQL How do I的第二篇,难度系数100,定位为进阶级。
对象之间的关系
既然是对象-关系映射,各个表之间肯定不是独立存在的(如果都是独立存在的,也没有必要用关系数据库了),那么就必然涉及到几个表之间的联合了。
Linq to SQL和SQL语句一样,支持两种方式的联合:
1. 利用where子句,对两个表进行查找
2. 使用join子句
我们还是用例子来说明吧,现在要对blogs和posts进行查询,传入一篇文章的id的时候,找出这篇文章相关信息的同时还要找出这篇文章属于哪个博客,接着上篇的例子,我们首先得给Blog类加上映射:
[Table(Name="blogs")]
public class Blog
[Table(Name="users")]
public class User
{
/**//// <summary>
/// 用户标识
/// </summary>
[Column(Name="userid",IsPrimaryKey=true,IsDbGenerated=true)]
public int Id { get; set; }
[Column]
public int BlogId { get; set; }
/**//// <summary>
/// 该用户对应的博客,
/// 一个用户有且仅有一个博客
/// </summary>
[Association(ThisKey="BlogId",OtherKey="Id",IsUnique=true)]
public EntitySet<Blog> Blog { get; set; }
/**//// <summary>
/// 用户名
/// </summary>
[Column]
public string UserName { get; set; }
/**//// <summary>
/// 密码
/// </summary>
[Column]
public string Password { get; set; }
/**//// <summary>
/// 昵称
/// </summary>
[Column]
public string NickName { get; set; }
/**//// <summary>
/// 用户离开时间,临时存储用户离开时间的,数据库
/// 里并没有对应的字段,所以不做映射
/// </summary>
public DateTime LeaveTime { get; set; }
}
Blog类前面已经出现过,我们就不列出全部代码,将Blog类修改如下:
[Column]
public int UserId { get; set; }
[Association(ThisKey="UserId",OtherKey="Id",IsUnique=true)]
public EntitySet<User> User { get; set; }
就是添加一个EntitySet<User> User的属性而已。
看看操作:
![](http://images.cnblogs.com/cnblogs_com/yuyijq/howdoi/howdoi_2_5.jpg)
通过查询结果可以看出,他们之间的关系建立了。
后记
本来这一篇我准备了好几个内容,但是在上篇评论里,有人说我的一篇太长了,确实,如果太长了,没有多少人能有耐心看下去,而且看的时间太长对眼睛也不好,在办公室里也不好意思老顶着屏幕看博客吧,boss看了也不好啊,所以这篇就光说一个关联了,那看来这个How do I原计划的三篇是不能完成了。其实文章有点长,看起来应该很快,没有什么难度的内容,而且我是以讲话的风格写的,本系列的内容我的计划是把Linq讲的透透彻彻的,从表面上如何使用,到后面是怎么实现的都说一遍,所以每一篇都是整个系列的一个元组。
内容 l 对象之间的关系 |
既然是对象-关系映射,各个表之间肯定不是独立存在的(如果都是独立存在的,也没有必要用关系数据库了),那么就必然涉及到几个表之间的联合了。
Linq to SQL和SQL语句一样,支持两种方式的联合:
1. 利用where子句,对两个表进行查找
2. 使用join子句
我们还是用例子来说明吧,现在要对blogs和posts进行查询,传入一篇文章的id的时候,找出这篇文章相关信息的同时还要找出这篇文章属于哪个博客,接着上篇的例子,我们首先得给Blog类加上映射:
[Table(Name="blogs")]
public class Blog
[Table(Name="users")]
public class User
{
/**//// <summary>
/// 用户标识
/// </summary>
[Column(Name="userid",IsPrimaryKey=true,IsDbGenerated=true)]
public int Id { get; set; }
[Column]
public int BlogId { get; set; }
/**//// <summary>
/// 该用户对应的博客,
/// 一个用户有且仅有一个博客
/// </summary>
[Association(ThisKey="BlogId",OtherKey="Id",IsUnique=true)]
public EntitySet<Blog> Blog { get; set; }
/**//// <summary>
/// 用户名
/// </summary>
[Column]
public string UserName { get; set; }
/**//// <summary>
/// 密码
/// </summary>
[Column]
public string Password { get; set; }
/**//// <summary>
/// 昵称
/// </summary>
[Column]
public string NickName { get; set; }
/**//// <summary>
/// 用户离开时间,临时存储用户离开时间的,数据库
/// 里并没有对应的字段,所以不做映射
/// </summary>
public DateTime LeaveTime { get; set; }
}
Blog类前面已经出现过,我们就不列出全部代码,将Blog类修改如下:
[Column]
public int UserId { get; set; }
[Association(ThisKey="UserId",OtherKey="Id",IsUnique=true)]
public EntitySet<User> User { get; set; }
就是添加一个EntitySet<User> User的属性而已。
看看操作:
![](http://images.cnblogs.com/cnblogs_com/yuyijq/howdoi/howdoi_2_5.jpg)
通过查询结果可以看出,他们之间的关系建立了。
后记
本来这一篇我准备了好几个内容,但是在上篇评论里,有人说我的一篇太长了,确实,如果太长了,没有多少人能有耐心看下去,而且看的时间太长对眼睛也不好,在办公室里也不好意思老顶着屏幕看博客吧,boss看了也不好啊,所以这篇就光说一个关联了,那看来这个How do I原计划的三篇是不能完成了。其实文章有点长,看起来应该很快,没有什么难度的内容,而且我是以讲话的风格写的,本系列的内容我的计划是把Linq讲的透透彻彻的,从表面上如何使用,到后面是怎么实现的都说一遍,所以每一篇都是整个系列的一个元组。
相关文章推荐
- 走进Linq-Linq to SQL How do I(3)
- How do I write a LINQ to Entities query which has the equivalent of the SQL “in” keyword?
- Linq to SQL how to do “where [column] in (list of values)”
- How to do sql injections with SQLMAP
- LINQ to SQL Tips 1: how to map an enum
- 走进Linq-Linq to SQL感性认识篇
- How to use MySql with Linq to SQL
- How to implement a many-to-many relationship using Linq to Sql ? (转)
- How to do...well...anything...in DB2 SQL
- SqlZoo.net习题答案:How to do joins.【Table Tennis】
- How to implement a many-to-many relationship using Linq to Sql ? Part II : add/remove support (转)
- 走进Linq-Linq to SQL源代码赏析,通过Linq to SQL看Linq
- SqlZoo.net习题答案:How to do joins.【Album】
- How to do a deep SQL tuning
- linq to sql 应用存储过程
- Linq to sql-存储过程
- LINQ to SQL的不足
- LINQ to SQL语句(12)之Delete和使用Attach
- LINQ to SQL语句(20)之存储过程
- Question[SQL]: How can I add row numbers to my result set?