在 ASP.NET 中使用 LINQ

更新:2007 年 11 月

您可以在网页中使用语言集成查询 (LINQ) 检索和修改数据。LINQ 将面向对象的编程原则应用于关系数据。它提供了一种在不同类型的数据源中查询数据的统一编程模型,并将数据功能直接扩展到 C# 和 Visual Basic 语言中。有关更多信息,请参见语言集成查询 (LINQ)

LINQ 可通过 LinqDataSource 控件、ObjectDataSource 控件或创建 LINQ 查询来使用。

当在 Web 应用程序中使用 LINQ 时,可能需要更改代码访问安全性的策略文件。有关这些更改的信息,请参见本主题后面的部分。

LinqDataSource 控件

LinqDataSource 控件提供了一种简便的方式来连接至数据库中的数据或内存中的数据集合(例如数组)。您可以用声明方式编写检索数据、筛选数据以及对数据进行排序和分组等典型方案所需的各种条件。此控件将基于您以声明方式提供的值动态创建 LINQ 查询。

在从 LINQ to SQL 数据上下文类中检索数据时,还可以配置 LinqDataSource 控件来处理更新、插入和删除操作。此控件可自动实现这一点,而无需您编写 SQL 命令来执行这些任务。

若要显示网页中的数据,可以将一个数据绑定控件绑定到 LinqDataSource 控件。GridViewDetailsView 控件都是数据绑定控件的示例。

下面的示例显示连接到 AdventureWorks 数据库的 LinqDataSource 控件的标记。它将返回 Contact 表中 EmailPromotion 属性值等于 1 的记录。

<asp:LinqDataSource 
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Contacts" 
    Where="EmailPromotion=1"
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>

有关更多信息,请参见 LinqDataSource Web 服务器控件概述

ObjectDataSource 控件

如果要采用比使用 LinqDataSource 控件更复杂的数据交互方式,可以使用 ObjectDataSource 控件。例如,您可以创建一个更新方法,以便将设置值包括在联结的表中。

ObjectDataSource 控件可用于 LINQ to SQL 类。若要达到此目的,请将 TypeName 属性设置为该数据上下文类的名称。此外,还应将 SelectMethodUpdateMethodInsertMethodDeleteMethod 方法设置为该数据上下文类中执行相应操作的方法。

在对 ObjectDataSource 控件使用延迟的查询执行时,必须为 ObjectDisposing 事件创建一个事件处理程序,才能取消对该数据上下文类的释放。此步骤非常必要,这是因为 LINQ to SQL 支持延迟的执行,而 ObjectDataSource 控件则会尝试在 Select 操作后释放该数据上下文。

LINQ 查询

您可以在网页中包括 LINQ 查询,而无需使用数据源控件。如果需要使用的查询运算符不在 LinqDataSource 控件中,则可以使用 LINQ 查询。此外,如果要在数据绑定控件中显示只读数据,而不进行创建数据源控件所需的处理,则也可以使用 LINQ 查询。有关 LINQ 运算符的更多信息,请参见标准查询运算符概述。有关 LinqDataSource 控件中的可用查询运算符的列表,请参见 LinqDataSource Web 服务器控件概述

下面的示例演示如何在网页中包括 LINQ 查询。此示例显示 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"/>

在 Name 属性设置为“ASP.Net”的 PermissionSet 元素中,添加一个具有下列属性的 IPermission 元素:

<IPermission
  class="ReflectionPermission"
  version="1"
  Flags="RestrictedMemberAccess"
/>
Bb907622.alert_note(zh-cn,VS.90).gif说明:

在安装过程中,可能已添加这些元素。

在高级信任级别下使用 LINQ

若要在以高级信任级别运行的 Web 应用程序中使用 LINQ,必须在为 High 信任级别定义的策略文件中包括一个元素。默认情况下,web_hightrust.config 文件是高级信任的策略文件。在此文件中,引用 ReflectionPermission 类的 PermissionsSet 元素中已包含 IPermission 元素。使用 LINQ 时,必须修改此元素。

在 Name 属性设置为“ASP.Net”的 PermissionSet 元素中,请找到 ReflectionPermission 的 IPermission 元素,然后按如下方式对其进行设置:

<IPermission
  class="ReflectionPermission"
  version="1"
  Flags="ReflectionEmit, RestrictedMemberAccess"
/>
Bb907622.alert_note(zh-cn,VS.90).gif说明:

在安装过程中,可能已修改此元素。

请参见

概念

LinqDataSource Web 服务器控件概述

其他资源

语言集成查询 (LINQ)