搭配 ASP.NET 使用 LINQ
更新:2007 年 11 月
您可以在 Web 網頁中使用 Language-Integrated Query (LINQ) 來擷取並修改資料。LINQ 會將物件導向程式設計的原則套用至關聯式資料。它提供統一的程式撰寫模型,可查詢來自不同資料來源類型的資料,並將資料功能直接延伸到 C# 及 Visual Basic 語言。如需詳細資訊,請參閱Language-Integrated Query (LINQ)。
您可以藉由 LinqDataSource 控制項、ObjectDataSource 控制項,或是建立 LINQ 查詢來使用 LINQ。
當您在 Web 應用程式中使用 LINQ 時,可能必須針對程式碼存取安全性變更其原則檔。這些變更稍後將於本主題中進一步說明。
LinqDataSource 控制項
LinqDataSource 控制項可讓您輕鬆連接至來自資料庫或記憶體中資料集合 (如陣列) 的資料。您可以使用宣告方式撰寫一般進行擷取、篩選、排序以及分組資料作業時所需的一切條件。控制項將從您以宣告方式提供的值,動態建立 LINQ 查詢。
當您從 LINQ to SQL 資料內容類別擷取資料時,可以同時設定 LinqDataSource 控制項以處理更新、插入及刪除作業。您不必撰寫 SQL 命令來執行這些工作,控制項就會處理。
若要顯示 Web 網頁中的資料,可以將資料繫結的控制項繫結至 LinqDataSource 控制項。GridView 或 DetailsView 控制項都是資料繫結控制項的範例。
下列範例中的標記就是連接到 AdventureWorks 資料庫的 LinqDataSource 控制項的標記。它會從 EmailPromotion 屬性值等於 1 的 Contact 資料表傳回資料錄。
<asp:LinqDataSource
ContextTypeName="AdventureWorksDataContext"
TableName="Contacts"
Where="EmailPromotion=1"
ID="LinqDataSource1"
>
</asp:LinqDataSource>
如需詳細資訊,請參閱 LinqDataSource Web 伺服器控制項概觀。
ObjectDataSource 控制項
當您想要以 LinqDataSource 控制項所能處理的更複雜方式來與資料互動時,可以使用 ObjectDataSource 控制項。例如,您可以在聯結的資料表中建立包含設定值的更新方法。
您可以將 ObjectDataSource 控制項與 LINQ to SQL 類別搭配使用。做法是將 TypeName 屬性設為資料內容類別的名稱。您也可以將 SelectMethod、UpdateMethod、InsertMethod 和 DeleteMethod 方法設為資料內容類別中的方法,以執行對應作業。
當您將延後的查詢執行作業搭配 ObjectDataSource 控制項使用時,為了取消資料內容類別的處置,您必須先建立 ObjectDisposing 事件的事件處理常式。由於 LINQ to SQL 支援延後執行,另一方面 ObjectDataSource 控制項卻會在 Select 作業後處置資料內容,因此這個步驟是必要的。
LINQ 查詢
您可以在 Web 網頁中包含 LINQ 查詢,而無須使用資料來源控制項。如果您需要使用 LinqDataSource 控制項中無法提供的查詢運算子時,可考慮使用 LINQ 控制項。如果您想要在資料繫結的控制項顯示唯讀資料,而不要進行建立資料來源控制項時的必要處理,也可以使用此控制項。如需 LINQ 運算子的詳細資訊,請參閱標準查詢運算子概觀。如需 LinqDataSource 控制項中可用之查詢運算子的清單,請參閱 LinqDataSource Web 伺服器控制項概觀。
下列範例說明如何將 LINQ 查詢包含在 Web 網頁內。此範例會在 GridView 控制項中顯示查詢的結果。
[Visual Basic]
Protected Sub Page_Load(ByVal sender As Object, _
ByVal e As System.EventArgs) Handles Me.Load
If Not IsPostBack Then
Dim dataContext As AdventureWorksDataContext = _
New AdventureWorksDataContext()
Dim query = From contact In dataContext.Contacts _
Where contact.EmailPromotion = 1 _
Select contact
GridView1.DataSource = query
GridView1.DataBind()
End If
End Sub
[C#]
protected void Page_Load(object sender, EventArgs e)
{
if (!IsPostBack)
{
AdventureWorksDataContext dataContext =
new AdventureWorksDataContext();
var query = from contact in dataContext.Contacts
where contact.EmailPromotion==1
select contact;
GridView1.DataSource = query;
GridView1.DataBind();
}
}
LINQ 和程式碼存取安全性
下列章節提供如何在中度信任與高度信任情況下使用 LINQ 的詳細資訊。
在中度信任情況下使用 LINQ
若要在中度信任情況下執行之 Web 應用程式中使用 LINQ,必須在定義為 Medium 信任的原則檔中納入兩個項目。根據預設,web_mediumtrust.config 檔案即是中度信任的原則檔。
在 SecurityClasses 項目中,加入具有下列屬性的 SecurityClass 項目:
<SecurityClass
Name="ReflectionPermission"
Description="System.Security.Permissions.ReflectionPermission, mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"/>
在 PermissionSet 項目 (其 Name 屬性設為 "ASP.Net") 內,加入具有下列屬性的 IPermission 項目:
<IPermission
class="ReflectionPermission"
version="1"
Flags="RestrictedMemberAccess"
/>
注意事項: |
---|
這些項目可能已在安裝處理序期間加入。 |
在高度信任情況下使用 LINQ
若要在高度信任情況下執行之 Web 應用程式中使用 LINQ,必須在定義為 High 信任的原則檔中納入一個項目。根據預設,web_hightrust.config 檔案即是高度信任的原則檔。此檔案已在 PermissionsSet 項目 (參考 ReflectionPermission 類別) 內加入 IPermission 項目。使用 LINQ 時,必須修改此項目。
在 PermissionSet 項目 (其 Name 屬性設為 "ASP.Net") 內,尋找 ReflectionPermission 的 IPermission 項目,並將其設定如下:
<IPermission
class="ReflectionPermission"
version="1"
Flags="ReflectionEmit, RestrictedMemberAccess"
/>
注意事項: |
---|
這個項目可能已在安裝處理序期間進行修改。 |