在使用Linq to Sql 以及 ADO.Net Entity Framework 時,
最好用的其中一個部份就是在處理關聯式的資料上,
這邊分成四小篇來分享一下在處理關聯式資料的查詢、新增、修改、刪除的方式,
以及一些小心得。
在使用Linq to Sql 以及 ADO.Net Entity Framework 時,
最好用的其中一個部份就是在處理關聯式的資料上,
這邊分成四小篇來分享一下在處理關聯式資料的查詢、新增、修改、刪除的方式,
以及一些小心得。
首先來看一下 示範資料庫的 ER-Model
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)
- 如果您覺得這篇文章有幫助,請您幫忙推薦一下或按上方的"讚"給予支持,非常感激
- 歡迎轉載,但請註明出處
- 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝