ADO.Net Entity Framework : (十) 關聯式資料搭配Gridview或ListView小技巧

转自:http://www.dotblogs.com.tw/asdtey/archive/2009/10/05/10916.aspx
在這邊分享一下我在使用ADO.Net Entity Framework利用GridView 或 ListView查詢關聯式資料的一點心得, 

示範資料的ER-Model 

情境很簡單,我有一個Tabel是 User(使用者),一個Tabel是 UserDepartment (使用者部門),另一個Table是 Group(群組), 
透過ER-Model可以清楚知道,一個使用者會對應到一個部門,但是可以屬於多個群組, 
現在我們要透過GridView呈現使用者完整的資料(包含部門以及群組),

1.我先建立一個Method來取得使用者的所有資料 

01 public List<User> GetList()
02 {
03     using (TestEntities te = new TestEntities())
04     {
05         var us = te.User.Include("Group").Include("UserDepartment")
06             .Execute(System.Data.Objects.MergeOption.NoTracking)
07             .Select(a => a).ToList();
08         return us;
09     }
10 }

2.在頁面上放置一個ObjectDataSource以及GridView,然後按照一般方式設定好

01 <form id="form1" runat="server">
02     <div>
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">
08             <Columns>
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" />               
15             </Columns>
16         </asp:GridView>
17     </div>
18     </form>

來看一下執行出來的結果

 

3.現在我們要加上使用者部門(UserDepartment) 
希望執行的結果像是這樣

 

大家可以想一下傳統的做法要怎麼做,小弟想到的是利用 GridView RowDataBound事件,一筆一筆的去資料庫找資料然後塞進GridView裡, 
但是如果透過ADO.Net Entity Framework來處理呢, 
修改 GridView  的 Columns 如下

01 <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">                   
09                     <ItemTemplate>
10                         <asp:Label ID="Label1" runat="server" Text='<%# Bind("UserDepartment.UserDepartment_name") %>'></asp:Label>
11                     </ItemTemplate>
12                 </asp:TemplateField>               
13             </Columns>

最重要的語法在 <%# Bind("UserDepartment.UserDepartment_name") %> 
在Linq to SQL 以及 ADO.Net Entity Framework 在資料繫結的時候,都可以利用這種方式,來呈現關聯的資料, 
執行結果就會像此步驟一開始的執行結果一樣

4.接下來我們想要顯示使用者屬於的群組, 
問題來了,使用者的群組可能是零到無限多,又要如何修改呢, 
我直接把做法寫出來,

01 <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">                   
09                     <ItemTemplate>
10                         <asp:Label ID="Label1" runat="server" Text='<%# Bind("UserDepartment.UserDepartment_name") %>'></asp:Label>
11                     </ItemTemplate>
12                 </asp:TemplateField>                               
13                 <asp:TemplateField HeaderText="Group" SortExpression="Group">                   
14                     <ItemTemplate>
15                         <ul>
16                             <asp:Repeater ID="Repeater1" runat="server" DataSource='<%# Eval("Group") %>'>
17                                 <ItemTemplate>
18                                     <li>
19                                         <%# Eval("Group_name")%></li>
20                                 </ItemTemplate>
21                             </asp:Repeater>
22                         </ul>
23                     </ItemTemplate>
24                 </asp:TemplateField>
25             </Columns>

執行結果如下

 

說明一下寫法,在這邊因為直接使用<%# Eval("Group") %>回傳的會是System.Data.Objects.DataClasses.EntityCollection型別, 
因此我用 Repeater 控制項去接 Eval("Group") 的資料,來把每一筆資料呈現出來。

 

有沒有覺得利用ADO.Net Entity Framework 在處理關聯資料的呈現上更快速呢, 
下次再針對關聯式資料的新增、查詢、修改、刪除與大家一起分享討論


 

  • 如果您覺得這篇文章有幫助,請您幫忙推薦一下
  • 歡迎轉載,但請註明出處
  • 文章內容多是自己找資料學習到的心得,如有不詳盡或錯誤的地方,請多多指教,謝謝
posted @ 2011-10-26 00:03  becket  阅读(652)  评论(0编辑  收藏  举报