DataSet多表關聯實現本地資料複雜的查詢

iDotNetSpace發表於2009-02-24

<!--

Code highlighting produced by Actipro CodeHighlighter (freeware)
http://www.CodeHighlighter.com/

--&gt            DataSet ds = new DataSet();

            
//提取第一個表 放在ds中
            dp.CommandText = "SELECT * FROM ss_RolesInAction";
            ds.Tables.Add(dp.ExecuteDataTable(
"ss_RolesInAction"));

            
//提取第二個表 放在ds中
            dp.CommandText = "SELECT * FROM ss_Action";
            ds.Tables.Add(dp.ExecuteDataTable(
"ss_Action"));

            
//提取第三個表 放在ds中
            dp.CommandText = "SELECT * FROM as_SiteMap";
            ds.Tables.Add(dp.ExecuteDataTable(
"as_SiteMap"));

            
//建立關係 ss_Action.FID = ss_RolesInAction.FActionID ,ss_RolesInAction.FActionID為外來鍵
            ds.Relations.Add("relation1", ds.Tables[1].Columns["FID"], ds.Tables[0].Columns["FActionID"]);
            
//建立關係 as_SiteMap.ID = ss_RolesInAction.FNodeID ,ss_RolesInAction.FNodeID 為外來鍵
            ds.Relations.Add("relation2", ds.Tables[2].Columns["ID"], ds.Tables[0].Columns["FNodeID"]);

            
            
//查詢條件測試1:對父表查詢獲取子表測試 
            
//條件為 ss_Action.FID 等於 6E7BB6B5-4DDA-4BB9-A156-71288CEF16B2 的或是 ss_RolesInAction.FActionID 等於 DB893F4E-B411-4FC0-9735-D5E9B7823083 或是 as_SiteMap.id 等於7的
            
//因為已經建立三個表的關係,所以,無論查詢條件是什麼 都會跟上 關係中的條件 即:
            
//ss_Action.FID = ss_RolesInAction.FActionID AND as_SiteMap.ID = ss_RolesInAction.FNodeID
            
//當我們指定的查詢條件為空時會 根據 關聯關係查詢 以下條件中的 完整關聯關係是這樣的
            
//(ss_Action.FID = ss_RolesInAction.FActionID AND as_SiteMap.ID = ss_RolesInAction.FNodeID ) and ss_Action.FID='6E7BB6B5-4DDA-4BB9-A156-71288CEF16B2' or ss_RolesInAction.FActionID= 'DB893F4E-B411-4FC0-9735-D5E9B7823083' or as_SiteMap.id=7
            DataView dv = ds.Tables[0].DefaultView;
            dv.RowFilter 
= "parent(relation1).FID='6E7BB6B5-4DDA-4BB9-A156-71288CEF16B2' or FActionID= 'DB893F4E-B411-4FC0-9735-D5E9B7823083' or parent(relation2).id=7";

            
//查詢條件測試2:對子表查詢獲取父表測試 
            
//因為子表與父表是 多對一 的關係所以 我們對子表查詢時 會返回多個值所以 使用 MAX 函式
            DataView dv = ds.Tables[1].DefaultView;
            dv.RowFilter 
= "max(child(relation1).FActionID) in ('FFD953C4-0920-4558-B87F-3A25CFB15754','FC5C91F5-45ED-4B3E-8E14-C2391B9A6B14') ";//這個查詢條件中無法關聯 as_SiteMap查詢條件 因為沒有 查詢表 as_SiteMap和返回表 ss_Action 的條件

            
this.GridView1.DataSource = dv;
            
this.GridView1.DataBind();

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12639172/viewspace-557573/,如需轉載,請註明出處,否則將追究法律責任。

相關文章