ADO.Net Entity Framework : (十一) 關聯式資料 - 查詢

在使用Linq to Sql 以及 ADO.Net Entity Framework 時,
最好用的其中一個部份就是在處理關聯式的資料上,
這邊分成四小篇來分享一下在處理關聯式資料的查詢、新增、修改、刪除的方式,
以及一些小心得。

在使用Linq to Sql 以及 ADO.Net Entity Framework 時,
最好用的其中一個部份就是在處理關聯式的資料上,
這邊分成四小篇來分享一下在處理關聯式資料的查詢、新增、修改、刪除的方式,
以及一些小心得。 

首先來看一下 示範資料庫的 ER-Model

2009-10-05_144141

User 使用者
Group 群組
UserDepartment 使用者部門 

好 我們現在有一個需求,要取得使用者所有的資料,包含使用者屬於的群組以及使用者部門名稱,
如果利用傳統的ADO.NET 我們可以怎麼做,

作法一 (ADO.NET)


        ////範例  查詢 UserName 為 Andy 的使用者資料
        ////利用 ADO.NET
        string sql = "select * from [user] join userdepartment on [user].user_userdepartmentid = userdepartment.userdepartment_id " +
            " join usergroup on usergroup_userid = user_id " +
            " join [group] on group_id = usergroup_groupid " +
            " where user_name = 'andy'";

        SqlConnection sc = new SqlConnection(@"Data Source=FORCENOTICE-DV\SQLEXPRESS;Initial Catalog=Test;Integrated Security=True;MultipleActiveResultSets=True");
        SqlCommand scm = new SqlCommand(sql, sc);
        sc.Open();
        SqlDataReader sr = scm.ExecuteReader();

        if (sr.Read())
        {
            ////顯示資料
            Response.Write("ADO.NET 方式");
            Response.Write("UserName:" + sr["user_name"].ToString() + "");
            Response.Write("Department:" + sr["userdepartment_name"].ToString() + "");
            Response.Write("Group:" + sr["group_name"].ToString() + "");

            while (sr.Read())
            {
                Response.Write("Group:" + sr["group_name"].ToString() + "");
            }
        }

        sr.Close();
        sc.Close();
        scm = null;

這是最基礎的寫法,自己組合SQL語法,然後使用建立Connection物件,再用DataReader去取得資料,
但是這樣很容易會寫錯SQL語法,又或者對Table之間的關聯不清楚,只是很簡單的需求,卻寫的很複雜 

作法二 (ADO.Net Entity Framework)


        ////範例  查詢 UserName 為 Andy 的使用者資料
        using (TestEntities te = new TestEntities())
        {
            ////取得 UserName為 Andy 的資料            
            var v = te.User.Where(a => a.User_name == "Andy").First();

            ////取得關聯資料,因為 ADO.NET Framework 預設在 Select 時,不會將關聯資料載入,
            ////必須下指令取得,此點與 Linq to SQL 不同, Linq to SQL 預設會載入
            v.UserDepartmentReference.Load();            
            v.Group.Load();

            ////顯示 Andy 的部門 (Departmant)
            string departmant = v.UserDepartment.UserDepartment_name;

            ////顯示 Andy 所屬群組清單 (Group)
            List<Group> usergroups = v.Group.ToList();

            ////顯示資料
            Response.Write("方式二<br/>");
            Response.Write("UserName:" + v.User_name + "");
            Response.Write("Department:" + departmant + "");
            foreach (var item in usergroups)
            {
                Response.Write("Group:" + item.Group_name + "");
            }
        }

 

取得資料的重點在這三行
var v = te.User.Where(a => a.User_name == "Andy").First();
v.UserDepartmentReference.Load();           
v.Group.Load();
改用ADO.Net Entity Framework 來取得資料,是不是簡單多了,
只是要注意一下, ADO.Net Entity Framework 預設不會將關聯資料載入
必須自己下指令 Load() 方法 去取得資料,
除了Load()方法,還有另一種方式,使用Include方法
在一開始Select的時候就先指定要包含哪些關聯資料,寫法如下


        using (TestEntities te = new TestEntities())
        {
            ////取得 UserName為 Andy 的資料
            ////利用 Include 語法 載入資料
            v = te.User.Include("UserDepartment").Include("Group").Where(a => a.User_name == "Andy").First();
        }

 
善用ADO.Net Entity Framework的導覽屬性,可以幫助在查詢關聯式資料時更簡化
小弟還有一邊介紹 查詢關聯式資料如何與GridView搭配使用,大家也可以參考一下


參考資料
ObjectQuery<(Of <(T>)>)..::.Include 方法
EntityCollection<(Of <(TEntity>)>)..::.Load 方法 (MergeOption)
EntityReference<(Of <(TEntity>)>)..::.Load 方法 (MergeOption)
使用導覽屬性巡覽關聯性 (Entity Framework)
使用查詢路徑來設定結果外觀 (Entity Framework)
明確載入相關的物件 (Entity Framework)




 


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的""給予支持,非常感激
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝