共用方式為


搭配 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 控制項。GridViewDetailsView 控制項都是資料繫結控制項的範例。

下列範例中的標記就是連接到 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 屬性設為資料內容類別的名稱。您也可以將 SelectMethodUpdateMethodInsertMethodDeleteMethod 方法設為資料內容類別中的方法,以執行對應作業。

當您將延後的查詢執行作業搭配 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"
/>
注意事項:

這個項目可能已在安裝處理序期間進行修改。

請參閱

概念

LinqDataSource Web 伺服器控制項概觀

其他資源

Language-Integrated Query (LINQ)