System.Web.UI.WebControls 命 ...


.NET Framework 类库
LinqDataSource 类

更新:2007 年 11 月

支持通过标记文本在 ASP.NET 网页中使用语言集成查询 (LINQ),以从数据对象中检索和修改数据。

命名空间:  System.Web.UI.WebControls
程序集:  System.Web.Extensions(在 System.Web.Extensions.dll 中)

语法

Visual Basic(声明)
<ToolboxBitmapAttribute(GetType(LinqDataSource), "LinqDataSource.ico")> _
<AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level := AspNetHostingPermissionLevel.Minimal)> _
<AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level := AspNetHostingPermissionLevel.Minimal)> _
Public Class LinqDataSource _
    Inherits DataSourceControl
Visual Basic (用法)
Dim instance As LinqDataSource
C#
[ToolboxBitmapAttribute(typeof(LinqDataSource), "LinqDataSource.ico")]
[AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal)]
public class LinqDataSource : DataSourceControl
Visual C++
[ToolboxBitmapAttribute(typeof(LinqDataSource), L"LinqDataSource.ico")]
[AspNetHostingPermissionAttribute(SecurityAction::LinkDemand, Level = AspNetHostingPermissionLevel::Minimal)]
[AspNetHostingPermissionAttribute(SecurityAction::InheritanceDemand, Level = AspNetHostingPermissionLevel::Minimal)]
public ref class LinqDataSource : public DataSourceControl
J#
/** @attribute ToolboxBitmapAttribute(LinqDataSource, "LinqDataSource.ico") */
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.LinkDemand, Level = AspNetHostingPermissionLevel.Minimal) */
/** @attribute AspNetHostingPermissionAttribute(SecurityAction.InheritanceDemand, Level = AspNetHostingPermissionLevel.Minimal) */
public class LinqDataSource extends DataSourceControl
JScript
public class LinqDataSource extends DataSourceControl
ASP.NET
<asp:LinqDataSource />
备注

语言集成查询 (LINQ) 是一种查询语法,它可定义一组查询运算符,以便在任何基于 .NET 的编程语言中以一种声明性的方式来表示遍历、筛选和投影操作。数据对象可以是内存中的数据集合,或者是表示数据库中数据的对象。无需为每个操作编写 SQL 命令,即可检索或修改数据。

使用 LinqDataSource 控件,您可以通过在标记文本中设置属性从而在 ASP.NET 网页中使用 LINQ。LinqDataSource 控件使用 LINQ to SQL 来自动生成数据命令。有关 LINQ to SQL 的更多信息,请参见 LINQ to SQL

当从内存中的数据集合检索数据时,可将 ContextTypeName 属性设置为包含该数据集合的类。还可将 TableName 属性设置为返回该数据集合的属性或字段。例如,可能存在一个名为 Person 的类,该类包含一个名为 FavoriteCities 的属性,该属性返回一个字符串值数组。在这种情况下,需将 ContextTypeName 属性设置为 Person,将 TableName 属性设置为 FavoriteCities

在查询某数据库时,必须先创建表示该数据库及其表的实体类。可以使用对象关系设计器或 SqlMetal.exe 实用工具来生成这些类。然后,可将 ContextTypeName 属性设置为表示该数据库的类,并将 TableName 属性设置为表示数据库表的属性。

LinqDataSource 控件按以下顺序应用数据操作:

  1. Where(指定要返回的数据记录)。

  2. Order By(排序)。

  3. Group By(聚合共享值的数据记录)。

  4. Order Groups By(对分组数据进行排序)。

  5. Select(指定要返回的字段或属性)。

  6. Auto-sort(按用户选定的属性对数据记录进行排序)。

  7. Auto-page(检索用户选定的数据记录的子集)。

可以向 Where 属性添加条件,以筛选查询返回的数据记录。如果未设置 Where 属性,LinqDataSource 控件会从数据对象中检索每一条记录。

可使用 OrderBy 属性指定返回数据中作为排序方式的属性的名称。

说明:

LinqDataSource 控件用于 SQL Server 2000 或 SQL Server Compact 3.5,并且 AutoPage 属性设置为 true 时,必须在 OrderBy 属性中提供值。默认情况下,AutoPage 属性为 true。如果向 Select 属性赋值,则还必须在查询返回的属性列表中包含所有标识列。

可使用 GroupBy 属性指定将使用哪些属性来合并具有相同值的数据记录。对数据进行分组时,可以在 Select 属性中包含 KeyIt,它们是动态创建的属性。Key 属性指的是用于对数据分组的一个或多个属性中的值。例如,如果按名为 Category 的属性进行分组,则 Key 属性将包含 Category 属性中的所有唯一值。It 属性指的是数据分组中各个记录的集合。可以循环访问 It 属性以检索在分组操作中合并的各个记录。例如,如果按名为 Category 的属性进行分组,则 It 属性包含 Category 属性中共享公共值的所有单条记录。

您可以使用 OrderGroupsBy 属性来指定对分组数据进行排序所要使用的属性。当您对数据进行分组时,OrderBy 属性会指定如何对分组数据中的各个记录进行排序。

默认情况下,LinqDataSource 控件从数据对象中检索所有属性的值。如果您要使用可用属性的子集,可使用 Select 属性来指定要返回的属性。Select 操作应用于 Where、Order By 和 Group By 操作之后。因此,如果在 Select 子句中创建一个别名,则该别名不能用于其他子句。

可以指定是否通过使用 EnableDeleteEnableInsertEnableUpdate 属性来启用数据修改。用于从 LinqDataSource 控件修改数据的用户界面通常利用数据绑定控件(如 DetailsView 控件)来提供。除了将 EnableDeleteEnableInsertEnableUpdate 设置为 true,还需要满足以下条件来启用自动数据修改:

您可以使用两种方法来限制数据绑定控件中显示的属性。可以将 Select 属性设置为属性子集,也可以通过添加 DataControlField 控件为数据绑定控件定义字段。但是,如果设置 Select 属性,则表示无法启用自动更新、插入和删除操作。如果要在使用可用属性子集时启用自动数据修改,请勿设置 Select 属性。相反,请检索数据对象中的所有属性并通过使用数据绑定控件来管理要显示的属性。当使用 DetailsView 控件或 GridView 控件时,还必须将 AutoGenerateRowsAutoGenerateColumns 属性设置为 false。这样会阻止数据绑定控件自动包含用于编辑和删除数据的按钮。任何未显示在数据绑定控件中的值都将存储在视图状态中。当执行数据更新时,它们会按原样传递到数据源。

如果在运行时必须计算供排序、筛选或分组的值,则可以将参数添加到 WhereParametersGroupByParametersOrderGroupsByParametersOrderByParameters 集合。

如果要指定如何处理空字符串值或要提供默认值,则可以将参数添加到 InsertParametersUpdateParametersDeleteParametersSelectParameters 集合。

如果要在执行数据操作之前对值进行检查或修改,则可以处理 DeletingInsertingSelectingUpdating 事件。还可以处理这些事件,以便取消数据操作或检查在基于用户输入来设置数据类中的属性时发生的验证错误。

若要在完成数据操作之后对值进行检查,则请处理 DeletedInsertedSelectedUpdated 事件。

通过为 Selecting 事件创建事件处理程序,可以使用 LinqDataSource 控件从存储过程检索数据。在事件处理程序中,调用数据上下文类中表示存储过程的方法,并将结果设置为 LinqDataSourceSelectEventArgs 对象的 Result 属性。如果要对数据启用自动更新、插入和删除操作,从该方法返回的类型必须与 TableName 属性中指定的类型相匹配。有关创建数据上下文方法的更多信息,请参见如何:创建映射到存储过程和函数的 DataContext 方法(O/R 设计器)

示例

下面的示例演示一个从名为 Products 的实体类检索数据的 LinqDataSource 控件。该实体类可能是通过使用 O/R 设计器或 SqlMetal.exe 实用工具生成的。Where 属性设置为仅返回 Price 属性值大于 50 的记录。GridView 控件绑定到 LinqDataSource 控件以显示数据。

Visual Basic
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    Where="Price > 50"
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    runat="server">
</asp:GridView>
C#
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    Where="Price > 50"
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    runat="server">
</asp:GridView>

下面的示例演示了一个使用户能够在数据源中更新、删除和插入记录的 LinqDataSource 控件。DetailsView 控件绑定到 LinqDataSource 控件,从而使用户能够查看和修改数据。请注意,若要选择、更新、删除或插入记录,无需使用任何 SQL 命令。

Visual Basic
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    EnableUpdate="true"
    EnableInsert="true"
    EnableDelete="true"
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>
<asp:DetailsView 
    DataKeyNames="ProductID"
    AutoGenerateEditButton="true"
    AutoGenerateDeleteButton="true"
    AutoGenerateInsertButton="true"
    AllowPaging="true"
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    runat="server">
</asp:DetailsView>
C#
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    EnableUpdate="true"
    EnableInsert="true"
    EnableDelete="true"
    ID="LinqDataSource1" 
    runat="server">
</asp:LinqDataSource>
<asp:DetailsView 
    DataKeyNames="ProductID"
    AutoGenerateEditButton="true"
    AutoGenerateDeleteButton="true"
    AutoGenerateInsertButton="true"
    AllowPaging="true"
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    runat="server">
</asp:DetailsView>

下面的示例演示 Selecting 事件的事件处理程序,该处理程序可根据网页中的值来设置数据对象。

Visual Basic
Partial Class Default3
    Inherits System.Web.UI.Page

    Dim cities() As String = _
    { _
        "Atlanta", _
        "Charlotte", _
        "Denver", _
        "New York", _
        "San Francisco" _
    }


    Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load

    End Sub


    Protected Sub LinqDataSource1_Selecting(ByVal sender As Object, ByVal e As System.Web.UI.WebControls.LinqDataSourceSelectEventArgs) Handles LinqDataSource1.Selecting
        e.Result = cities
    End Sub

End Class
C#
public partial class Default3 : System.Web.UI.Page
{
    string[] cities = 
    { 
        "Atlanta", 
        "Charlotte", 
        "Denver", 
        "New York", 
        "San Francisco" 
    };

    protected void Page_Load(object sender, EventArgs e)
    {
    }

    protected void LinqDataSource_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
        e.Result = cities;
    }
}

下面的示例演示了一个配置为按两列进行分组的 LinqDataSource 控件。Key 属性引用包含两个属性(ProductCategoryColor)的对象。由 It 表示的对象将重命名(别名)为 Products。重命名的 Products 对象包含分组中各个记录的集合。每个实例均包含 Products 表中的所有列。

Visual Basic
<asp:LinqDataSource 
  ContextTypeName="ExampleDataContext" 
  TableName="Products" 
  GroupBy="new(ProductCategory, Color)"
  Select="new(Key,
          It As Products,
          Max(ListPrice) As MaxListPrice, 
          Min(ListPrice) As MinListPrice)"
  ID="LinqDataSource1" 
  runat="server">
</asp:LinqDataSource>
C#
<asp:LinqDataSource 
  ContextTypeName="ExampleDataContext" 
  TableName="Products" 
  GroupBy="new(ProductCategory, Color)"
  Select="new(Key,
          It As Products,
          Max(ListPrice) As MaxListPrice, 
          Min(ListPrice) As MinListPrice)"
  ID="LinqDataSource1" 
  runat="server">
</asp:LinqDataSource>

下面的示例演示两个 ListView 控件,它们显示上例中 LinqDataSource 控件的数据。一个 ListView 控件显示分组数据,另一个 ListView 控件显示属于该组的各个产品名称。嵌套数据绑定控件的 DataSource 属性设置为 Products,此为 It 对象的别名。

Visual Basic
<asp:ListView 
   DataSourceID="LinqDataSource1" 
   ID="ListView1" runat="server">

   <LayoutTemplate>
     <table id="Table1" 
         style="background-color:Teal;color:White" 
         runat="server" 
         class="Layout">

       <thead>
         <tr>
           <th><b>Product Category</b></th>
           <th><b>Color</b></th>
           <th><b>Highest Price</b></th>
           <th><b>Lowest Price</b></th>
         </tr>
       </thead>
       <tr runat="server" id="itemPlaceholder">
       </tr>

     </table>
   </LayoutTemplate>

   <ItemTemplate>
     <tr>
       <td><%# Eval("key.ProductCategory") %></td>
       <td><%# Eval("key.Color") %></td>
       <td><%# Eval("MaxListPrice") %></td>
       <td><%# Eval("MinListPrice") %></td>
     </tr>
     <tr>

       <td colspan="4" style="width:100%;background-color:White;color:Black">
         <asp:ListView 
           DataSource='<%# Eval("Products") %>' 
           runat="server" 
           ID="ListView2">

           <LayoutTemplate>
             <div runat="server" id="itemPlaceholder" />
           </LayoutTemplate>

           <ItemTemplate>
             <%# Eval("ProductName") %><br />
           </ItemTemplate>

         </asp:ListView> 
       </td>
     </tr>
   </ItemTemplate>
 </asp:ListView>
C#
<asp:ListView 
    DataSourceID="LinqDataSource1" 
    ID="ListView1" runat="server">

    <LayoutTemplate>
      <table id="Table1" 
          style="background-color:Teal;color:White" 
          runat="server" 
          class="Layout">

        <thead>
          <tr>
            <th><b>Product Category</b></th>
            <th><b>Color</b></th>
            <th><b>Highest Price</b></th>
            <th><b>Lowest Price</b></th>
          </tr>
        </thead>
        <tr runat="server" id="itemPlaceholder">
        </tr>

      </table>
    </LayoutTemplate>

    <ItemTemplate>
      <tr>
        <td><%# Eval("key.ProductCategory") %></td>
        <td><%# Eval("key.Color") %></td>
        <td><%# Eval("MaxListPrice") %></td>
        <td><%# Eval("MinListPrice") %></td>
      </tr>
      <tr>

        <td colspan="4" style="width:100%;background-color:White;color:Black">
          <asp:ListView 
            DataSource='<%# Eval("Products") %>' 
            runat="server" 
            ID="ListView2">

            <LayoutTemplate>
              <div runat="server" id="itemPlaceholder" />
            </LayoutTemplate>

            <ItemTemplate>
              <%# Eval("ProductName") %><br />
            </ItemTemplate>

          </asp:ListView> 
        </td>
      </tr>
    </ItemTemplate>
  </asp:ListView>
权限

继承层次结构

System..::.Object
  System.Web.UI..::.Control
    System.Web.UI..::.DataSourceControl
      System.Web.UI.WebControls..::.LinqDataSource
线程安全

此类型的任何公共 static(在 Visual Basic 中为 Shared) 成员都是线程安全的。但不保证所有实例成员都是线程安全的。
平台

Windows Vista, Windows XP SP2, Windows Server 2003

.NET Framework 和 .NET Compact Framework 并不是对每个平台的所有版本都提供支持。有关支持的版本的列表,请参见.NET Framework 系统要求

版本信息

.NET Framework

受以下版本支持:3.5
另请参见

参考

其他资源

标记 :


Page view tracker