有如下兩表,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圖(資料庫模型圖)剛好相反.