遗忘海岸

江湖程序员 -Feiph(LM战士)

导航

Subsonic中的inner join操作

 

有如下两表,Rule跟,RuleGroup, RuleGroup是 Rule表与Group表的关联表(Rule,跟 Group为多对多关系),应此,RuleGroup到Rule应该为 n:1(多对一)反之为一对多关系,现在对两张表做innerjion操作,使用Subsonic可以有如下两种写法.

 注意,为保证生成正确的SQL语句,在Subsoinc中需要交叉放置两张表的位置,即From<xxx>.InnerJoin(yyy,xxx)...
其中xxx,yyy表示RuleGroup,或Rule表. 如果不是交叉放置那么将生成 xxx innerjoin xxx on xxx.nn=yy.nn 这样的SQL语句

  代码如下:

     SqlQuery q = new Select("Name", "RuleId").From<RuleGroup>().InnerJoin(KWSTool.DAL.Rule.IdColumn, RuleGroup.RuleIDColumn).Where("groupid").IsEqualTo(1);
        Response.Write(q.ToString() + "<br>");

        q = new Select("Name", "RuleId").From<KWSTool.DAL.Rule>().InnerJoin(RuleGroup.RuleIDColumn, KWSTool.DAL.Rule.IdColumn).Where("groupid").IsEqualTo(1);
        Response.Write(q.ToString());



  输出结果:
 1:SELECT Name, [dbo].[RuleGroup].[RuleID] FROM [dbo].[RuleGroup] INNER JOIN [dbo].[Rule] ON [dbo].[RuleGroup].[RuleID] = [dbo].[Rule].[ID] WHERE [dbo].[RuleGroup].[GroupID] = @GroupID0

2:SELECT [dbo].[Rule].[Name], RuleId FROM [dbo].[Rule] INNER JOIN [dbo].[RuleGroup] ON [dbo].[Rule].[ID] = [dbo].[RuleGroup].[RuleID] WHERE groupid = @groupid0

 

 另外要说的是.net3.x 的Linq to Sql  中的 .DBML文件中会将数据库中的一对多关系(如 Rule 到 RuleGroup) 会转变成"类图"中聚合关系,表示为:Rule <>--------------->RuleGroup,即一个Rule中含有多个RuleGroup, 需要注意的是箭头的方向跟数据库ER图(数据库模型图)刚好相反.

posted on 2008-11-25 08:46  遗忘海岸  阅读(942)  评论(0编辑  收藏  举报