转自:http://www.dotblogs.com.tw/asdtey/archive/2009/10/05/10916.aspx
在這邊分享一下我在使用ADO.Net Entity Framework利用GridView 或 ListView查詢關聯式資料的一點心得,
示範資料的ER-Model
![](http://files.dotblogs.com.tw/asdtey/0910/200910514422522.jpg)
情境很簡單,我有一個Tabel是 User(使用者),一個Tabel是 UserDepartment (使用者部門),另一個Table是 Group(群組),
透過ER-Model可以清楚知道,一個使用者會對應到一個部門,但是可以屬於多個群組,
現在我們要透過GridView呈現使用者完整的資料(包含部門以及群組),
1.我先建立一個Method來取得使用者的所有資料
01 |
public List<User> GetList() |
03 |
using (TestEntities te = new TestEntities()) |
05 |
var us = te.User.Include( "Group" ).Include( "UserDepartment" ) |
06 |
.Execute(System.Data.Objects.MergeOption.NoTracking) |
07 |
.Select(a => a).ToList(); |
2.在頁面上放置一個ObjectDataSource以及GridView,然後按照一般方式設定好
01 |
< form id = "form1" runat = "server" > |
03 |
< asp:ObjectDataSource ID = "ObjectDataSource1" runat = "server" |
04 |
SelectMethod = "GetList" TypeName = "EF.BL.DataAccess.TUser" > |
05 |
</ asp:ObjectDataSource > |
06 |
< asp:GridView ID = "GridView1" runat = "server" AutoGenerateColumns = "False" |
07 |
DataSourceID = "ObjectDataSource1" > |
09 |
< asp:BoundField DataField = "User_id" HeaderText = "User_id" |
10 |
SortExpression = "User_id" /> |
11 |
< asp:BoundField DataField = "User_name" HeaderText = "User_name" |
12 |
SortExpression = "User_name" /> |
13 |
< asp:BoundField DataField = "User_email" HeaderText = "User_email" |
14 |
SortExpression = "User_email" /> |
來看一下執行出來的結果
![](http://files.dotblogs.com.tw/asdtey/0910/2009105143949312.jpg)
3.現在我們要加上使用者部門(UserDepartment)
希望執行的結果像是這樣
![](http://files.dotblogs.com.tw/asdtey/0910/2009105143956473.jpg)
大家可以想一下傳統的做法要怎麼做,小弟想到的是利用 GridView RowDataBound事件,一筆一筆的去資料庫找資料然後塞進GridView裡,
但是如果透過ADO.Net Entity Framework來處理呢,
修改 GridView 的 Columns 如下
02 |
<asp:BoundField DataField= "User_id" HeaderText= "User_id" |
03 |
SortExpression= "User_id" /> |
04 |
<asp:BoundField DataField= "User_name" HeaderText= "User_name" |
05 |
SortExpression= "User_name" /> |
06 |
<asp:BoundField DataField= "User_email" HeaderText= "User_email" |
07 |
SortExpression= "User_email" /> |
08 |
<asp:TemplateField HeaderText= "UserDepartment" SortExpression= "UserDepartment" > |
10 |
<asp:Label ID= "Label1" runat= "server" Text= '<%# Bind("UserDepartment.UserDepartment_name") %>' ></asp:Label> |
最重要的語法在 <%# Bind("UserDepartment.UserDepartment_name") %>
在Linq to SQL 以及 ADO.Net Entity Framework 在資料繫結的時候,都可以利用這種方式,來呈現關聯的資料,
執行結果就會像此步驟一開始的執行結果一樣
4.接下來我們想要顯示使用者屬於的群組,
問題來了,使用者的群組可能是零到無限多,又要如何修改呢,
我直接把做法寫出來,
02 |
<asp:BoundField DataField= "User_id" HeaderText= "User_id" |
03 |
SortExpression= "User_id" /> |
04 |
<asp:BoundField DataField= "User_name" HeaderText= "User_name" |
05 |
SortExpression= "User_name" /> |
06 |
<asp:BoundField DataField= "User_email" HeaderText= "User_email" |
07 |
SortExpression= "User_email" /> |
08 |
<asp:TemplateField HeaderText= "UserDepartment" SortExpression= "UserDepartment" > |
10 |
<asp:Label ID= "Label1" runat= "server" Text= '<%# Bind("UserDepartment.UserDepartment_name") %>' ></asp:Label> |
13 |
<asp:TemplateField HeaderText= "Group" SortExpression= "Group" > |
16 |
<asp:Repeater ID= "Repeater1" runat= "server" DataSource= '<%# Eval("Group") %>' > |
19 |
<%# Eval( "Group_name" )%></li> |
執行結果如下
![](http://files.dotblogs.com.tw/asdtey/0910/200910514402355.jpg)
說明一下寫法,在這邊因為直接使用<%# Eval("Group") %>回傳的會是System.Data.Objects.DataClasses.EntityCollection型別,
因此我用 Repeater 控制項去接 Eval("Group") 的資料,來把每一筆資料呈現出來。
有沒有覺得利用ADO.Net Entity Framework 在處理關聯資料的呈現上更快速呢,
下次再針對關聯式資料的新增、查詢、修改、刪除與大家一起分享討論
- 如果您覺得這篇文章有幫助,請您幫忙推薦一下
- 歡迎轉載,但請註明出處
- 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝