共用方式為


逐步解說:使用 LinqDataSource 和 GridView 控制項選取和篩選資料子集

更新:2007 年 11 月

這個逐步解說說明如何使用 LinqDataSource 控制項來建立一組資料,這組資料不限於單一資料庫資料表的值。您將使用 LinqDataSource 控制項,從資料表選取資料子集、從選取的值計算新的值,以及從關聯資料表擷取值。您也將篩選傳回的資料錄。然後,您將使用 GridView 控制項顯示一組新的值。

這個逐步解說主要藉由從 AdventureWorks 範例資料庫的 Product 資料表選取值的過程來說明資料存取的方式。Product 資料表中有資料行是其他資料表的外部索引鍵,您將從這些關聯資料表擷取資料。

您將會使用物件關聯式設計工具建立類別,這個類別代表包含值的資料庫資料表。LinqDataSource 控制項會與這個產生的類別互動,以擷取和更新資料。

必要條件

實作本逐步解說中的程序,您需要:

  • Visual Studio 2008 或 Visual Web Developer Express 版。

  • ASP.NET 網站。

  • SQL Server Express Edition。如果已經安裝 SQL Server,則只需稍微調整某些程序,就可以使用 SQL Server。

  • 電腦上已安裝的 AdventureWorks 資料庫。若要下載 AdventureWorks 資料庫,請參閱 SQL Server 2005 範例和範例資料庫 (英文)。

  • 網站中連接到 AdventureWorks 資料庫的連接字串。

建立類別以代表資料庫實體

若要使用 LinqDataSource 控制項處理資料庫資料,請建立代表資料庫實體 (Entity) 的類別。您可以使用 Visual Studio 2008 中的工具建立這些類別。

建立 AdventureWorks 資料庫資料表的類別

  1. 如果網站沒有 App_Code 資枓夾,請以滑鼠右鍵按一下 [方案總管] 中的專案名稱,然後按一下 [加入 ASP.NET 資料夾],再按一下 [App_Code]。

  2. 以滑鼠右鍵按一下 [App_Code] 資料夾,然後按一下 [加入新項目]。

    接著會顯示 [加入新項目] 對話方塊。

  3. 選取 [Visual Studio 安裝的範本] 底下的 [LINQ to SQL 類別],將檔案命名為 AdventureWorks.dbml,然後按一下 [ 加入]。

    [物件關聯式設計工具] 隨即出現。

  4. 在 [伺服器總管] 中,將 [Product (Production)] 資料表拖曳至 [物件關聯式設計工具] 視窗。

    在設計工具視窗中,Product (Production) 資料表及其資料行會以名為 Product 的實體表示。

  5. 將 ProductSubCategory 資料表和 UnitMeasure 資料表拖曳至設計工具視窗。

    在設計工具視窗中,這些資料表及其資料行會以實體表示。Product 與兩個關聯資料表之間的關聯性以虛線顯示。

  6. 儲存 AdventureWorks.dbml 檔案。

  7. 在 [方案總管] 中,開啟 AdventureWorks.designer.cs 或 AdventureWorks.designer.vb 檔案。

    這個檔案具有名為 AdventureWorksDataContext、Product、ProductSubCategory 和 UnitMeasure 的類別。Product 類別包含名為 ProductSubcategory、UnitMeasure 和 UnitMeasure1 的屬性。這些屬性使用 AssociationAttribute 屬性標記為外部索引鍵。它們會傳回代表 ProductSubCategory 和 UnitMeasure 資料表的物件。

    UnitMeasure 屬性代表 SizeUnitMeasureCode 資料行值的外部索引鍵關聯性。UnitMeasure1 屬性代表 WeightUnitMeasureCode 資料行的外部索引鍵。

選取要擷取的資料行

如果您沒有指定 Select 屬性的值,LinqDataSource 控制項會從代表資料庫資料表的類別傳回所有屬性 (資料行)。

使用 LinqDataSource 控制項擷取資料子集

  1. 在 Visual Studio 中,建立新的 ASP.NET Web 網頁並切換至 [原始碼] 檢視。

  2. 從 [工具箱] 的 [資料] 索引標籤中,將 LinqDataSource 控制項拖放至 Web 網頁的 form 項目內。

    您可以將 ID 屬性保留為 LinqDataSource1。

  3. ContextTypeName 屬性設定為 AdventureWorksDataContext。

    AdventureWorksDataContext 類別是代表 AdventureWorks 資料庫的資料內容類別。資料庫的每個資料表都有一個屬性。

  4. TableName 屬性設定為 Products。

  5. Select 屬性設定如下:

    new(Name, Size, StandardCost, ListPrice, DaysToManufacture)
    

    您可以設定 Select 屬性,限制要從 Products 類別擷取的屬性。從類別中選取一個以上的屬性時,必須使用 new 運算子括住屬性。這是因為 LinqDataSource 控制項不會傳回 TableName 屬性所指定之類別的執行個體。相反地,傳回動態建立之類別的執行個體,這個執行個體只包含這些屬性。

篩選要擷取的資料錄

如果您未指定 Where 屬性的值,LinqDataSource 控制項會傳回資料庫資料表的所有資料錄。您可以設定 Where 屬性,篩選要傳回的資料錄。您可以依靜態值篩選,例如 ListPrice > 0,只傳回 ListPrice 屬性值大於零的資料錄。您也可以將參數加入至 WhereParameters 集合,在執行階段指派值。

在執行階段使用 LinqDataSource 控制項篩選資料

  1. DropDownList 控制項加入至 Web 網頁,並將其 AutoPostBack 屬性設定為 true。

    保留預設名稱 DropDownList1。

  2. 將四個清單項目加入至 DropDownList1 控制項,分別將值設定為 0、25、100 和 400。

  3. LinqDataSource 控制項的開頭標記與結尾標記之間加入 WhereParameters 項目。

  4. ControlParameter 控制項加入至 WhereParameters 集合。

  5. ControlParameter 控制項的 ControlID 屬性設定為 DropDownList1,將 Name 屬性設定為 SelectedPrice,以及將 Type 屬性設定為 Int32。

    在執行階段,SelectedPrice 參數將包含 DropDownList1 中選取的值。

  6. Where 屬性設定為 ListPrice > @SelectedPrice,只選取 ListPrice 值大於使用者所選取之值的資料錄。

    下列範例顯示 DropDownListLinqDataSource 控制項的宣告式標記。

    <asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
      <asp:ListItem Value="0"></asp:ListItem>
      <asp:ListItem Value="25"></asp:ListItem>
      <asp:ListItem Value="100"></asp:ListItem>
      <asp:ListItem Value="400"></asp:ListItem>
    </asp:DropDownList>
    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="ListPrice > @SelectedPrice" 
      Select="new(Name, Size, StandardCost, ListPrice, DaysToManufacture)" 
      ID="LinqDataSource1" 
      >
      <WhereParameters>
        <asp:ControlParameter 
          Name="SelectedPrice" 
          DefaultValue="0" 
          ControlID="DropDownList1" 
          Type="Int32" />
      </WhereParameters>
    </asp:LinqDataSource>
    

加入控制項以顯示資料

您現在可以加入 GridView 控制項,並將它繫結至 LinqDataSource 控制項。GridView 控制項可讓使用者檢視以 LinqDataSource 控制項管理的資料列。使用者將可以排序和逐頁查看資料。

在 GridView 控制項中顯示資料子集

  1. 在 [工具箱] 的 [資料] 索引標籤中,按兩下 GridView 控制項以加入至頁面。

  2. GridView 控制項的 DataSourceID 屬性設定為 LinqDataSource1。

    這樣會將 GridView 控制項繫結至 LinqDataSource 控制項所傳回的資料。

  3. AllowPagingAllowSorting 屬性設定為 true。

    若要讓 LinqDataSource 控制項可以排序和分頁,AutoSortAutoPage 屬性必須為 true。根據預設,這兩個值都是 true。

  4. AutoGenerateColumns 屬性設定為 false。

  5. 若要指定資料行的順序,請為您在 LinqDataSource 控制項的 Where 屬性中指定的每個屬性 (Name、Size、StandardCost、ListPrice 和 DaysToManufacture),建立一個 BoundField 控制項。

    下列範例將顯示 GridView 控制項的宣告式標記。

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
            DataField="Name" 
            HeaderText="Name" 
            SortExpression="Name" />
        <asp:BoundField 
            DataField="Size" 
            HeaderText="Size" 
            SortExpression="Size" />
        <asp:BoundField 
            DataField="StandardCost" 
            HeaderText="Standard Cost" 
            SortExpression="StandardCost" />
        <asp:BoundField 
            DataField="ListPrice" 
            HeaderText="List Price" 
            SortExpression="ListPrice" />
        <asp:BoundField 
            DataField="DaysToManufacture" 
            HeaderText="Days To Manufacture" 
            SortExpression="DaysToManufacture" />
      </Columns>
    </asp:GridView>
    
  6. 儲存頁面,然後按 CTRL+F5 在瀏覽器中檢視頁面。

    GridView 控制項會顯示 Product 資料表中目前資料錄的資料行。您可以按一下資料行標題排序資料錄,也可以按一下頁碼逐頁查看資料錄。

使用資料來源值計算新的值

除了從資料庫資料表中選取值,您也可以計算新的值。如果您要顯示的值必須計算資料來源的值才能求得,您就可能想要這樣做。然後,您就可以在 GridView 控制項中顯示這些值。

從資料來源計算和顯示新的值

  1. Select 屬性的值變更如下:

    new(Name, 
        Size, 
        StandardCost, 
        ListPrice, 
        ListPrice - StandardCost as PriceDifference, 
        DaysToManufacture / 5.0 as WeeksToManufacture)
    

    資料庫中沒有額外的值 PriceDifference 和 WeeksToManufacture。您必須計算資料庫的值之後,才能顯示這些值。

  2. GridView 控制項中加入 PriceDifference 和 WeeksToManufacture 資料行的 BoundField 控制項,移除 DaysToManufacture 的 BoundField 控制項。

    下列範例顯示計算之 BoundField 控制項的宣告式標記。

        <asp:BoundField 
            DataField="PriceDifference" 
            HeaderText="Price Difference" 
            SortExpression="Price Difference" />
        <asp:BoundField 
            DataField="WeeksToManufacture" 
            HeaderText="Weeks To Manufacture" 
            SortExpression="WeeksToManufacture" />
    
  3. 儲存頁面,然後按 CTRL+F5 在瀏覽器中檢視頁面。

    GridView 控制項顯示 Product 資料表中目前資料錄的資料行和計算出來的值。

從關聯資料表選取值

您可以使用一個 LinqDataSource 控制項擷取資料表和其任何關聯資料表的值。當一個資料表和其他資料表之間具有外部索引鍵關聯性時,物件關聯式設計工具會產生實體類別,其中包含每個關聯資料表的屬性。這些屬性會傳回代表關聯資料表的物件。這個物件又包含關聯資料表中所有資料行的屬性。您可以在代表關聯資料表的類別中存取物件,以選取關聯資料表中的值。

從關聯資料表擷取資料

  1. LinqDataSource 控制項的 Select 屬性設定如下:

    new(Name, 
        Size, 
        UnitMeasure.Name as SizeMeasureName, 
        Weight, 
        UnitMeasure1.Name as WeightMeasureName, 
        ProductSubcategory.Name as SubCategoryName)
    

    SizeMeasureName、WeightMeasureName 和 SubCategoryName 屬性包含資料表的值,這些資料表與 Products 資料表之間具有外部索引鍵關聯性。

  2. 如果只要傳回具有大小或重量度量單位的產品,請將 Where 屬性設定如下:

    WeightUnitMeasureCode != null || SizeUnitMeasureCode != null
    

    篩選這些值說明 LinqDataSource 控制項如何管理外部索引鍵關聯性。|| 運算子執行邏輯 OR 運算。因此,只會傳回已將值指派給至少一個外部索引鍵的資料錄。

    下列範例顯示 LinqDataSource 控制項的宣告式標記。

    <asp:LinqDataSource 
      ContextTypeName="AdventureWorksDataContext" 
      TableName="Products" 
      Where="WeightUnitMeasureCode != null || 
             SizeUnitMeasureCode != null"
      Select="new(Name,
                  Size, 
                  UnitMeasure.Name as SizeMeasureName, 
                  Weight, 
                  UnitMeasure1.Name as WeightMeasureName, 
                  ProductSubCategory.Name as SubCategoryName)" 
      ID="LinqDataSource1" 
      >
    </asp:LinqDataSource>
    
  3. GridView 控制項中,為每個要顯示的資料行加入一個 BoundField 控制項。這些資料行包括 Name、Size、SizeMeasureName、Weight、WeightMeasureName 和 SubCategoryName。

    下列範例顯示 GridView 控制項的宣告式標記。

    <asp:GridView 
      AllowPaging="true" 
      AllowSorting="true" 
      AutoGenerateColumns="false" 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      >
      <Columns>
        <asp:BoundField 
              DataField="Name" 
              HeaderText="Name" 
              SortExpression="Name" />
        <asp:BoundField 
              DataField="Size" 
              HeaderText="Size" 
              SortExpression="Size" />
        <asp:BoundField 
              DataField="SizeMeasureName" 
              HeaderText="Size Unit of Measurement" 
              SortExpression="SizeMeasureName" />
        <asp:BoundField 
              DataField="Weight" 
              HeaderText="Weight" 
              SortExpression="Weight" />
        <asp:BoundField 
              DataField="WeightMeasureName" 
              HeaderText="Weight Unit of Measurement" 
              SortExpression="WeightMeasureName" />
        <asp:BoundField 
              DataField="SubCategoryName" 
              HeaderText="Subcategory Name" 
              SortExpression="SubCategoryName" />
      </Columns>
    </asp:GridView>
    
  4. 儲存頁面,然後按 CTRL+F5 在瀏覽器中檢視頁面。

    GridView 控制項會顯示 Product、ProductSubCategory 和 UnitMeasure 資料表的值。您可以排序和逐頁查看資料錄。

後續步驟

在這個逐步解說中,您已學會如何使用 LinqDataSource 控制項,自訂在查詢中要傳回的資料行和資料錄。您可將更多功能加入至 LinqDataSource 控制項,如下所列:

請參閱

概念

LinqDataSource Web 伺服器控制項概觀