商讯信箱
用户名: @
密  码:   注册|忘记密码
登录
个人用户经销商
您的位置:首页 > 技术频道 > 正文

Linq To Sql进阶系列(二)M:M关系

作者:Tom Song  2008-01-15
【IT168技术文档】
  创建数据库后,添加一些数据供测试。
insert into [User] values('Tom Song','Tom Song') insert into [User] values('Guoan Song','Guoan Song') insert into [Group] values ('Csharp','Csharp Team') insert into [Group] values ('Dlinq','Dlinq Team') insert into UserInGroup values ('Tom Song','Csharp') insert into UserInGroup values ('Tom Song','Dlinq') insert into UserInGroup values ('Guoan Song','Csharp') insert into UserInGroup values ('Guoan Song','Dlinq')
  使用OR Designer将他们映射为实体。关于OR Designer请参考C#3.0入门系列(七)--之OR工具介绍

  现在的问题是:User和Group的实体对象中,可不可以直接引用对方呢?就像User.Groups 或Group.Users。我们可不可以去改变其映射,直接越过UserInGroup,让User和Group直接发生关系呢?回答是肯定的。但是,数据库中,依然是三个表。你不可能在数据库中越过表UserInGroup的。表UserInGroup起了一个纽带的作用,想把它抛弃掉,不太可能。那可不可以,在mapping code中,做些手脚,让Linq To Sql自己去找这个纽带呢?回答是,Linq To Object可以,但是, Linq To Sql不可以。

  为什么Linq To Sql不可以?其原因就是Linq To Sql需要先翻译成Sql语句,而,这个映射,必须真实反映数据库里表的情况。也就说,这个映射,无法逾越UserInGroup实体。它必须要有UserInGroup。
  那Linq To Object怎么样可以呢?把下面的代码,加入到你的工程中。
using System.Data.Linq; using System.Data.Linq.Mapping; using System.Data; using System.Collections.Generic; using System.Reflection; using System.Linq; using System.Linq.Expressions; using System.Runtime.Serialization; using System.ComponentModel; using System; namespace ConsoleApplication1 { public partial class Group { public List<User> Users { get { return (from u in this.UserInGroups select u.User).ToList(); } } } public partial class User { public List<Group> Groups { get { return (from g in this.UserInGroups select g.Group ).ToList(); } } } }
1 2 3
【内容导航】
第1页: 概述 第2页: 第2页
第3页: 第3页
©版权所有。未经许可,不得转载。
[责任编辑:nancy]
[an error occurred while processing this directive]