次の方法で共有


方法 : LinqDataSource コントロールを使用してデータをグループ化および集計する

更新 : 2007 年 11 月

LinqDataSource コントロールを使用すると、データ ソースのデータを 1 つ以上のデータ列を使用してグループ化できます。データ ソースから、ある列の値が共通である全レコードの情報を取得したい場合、その列を基準にしてレコードをグループ化します。多くの場合、グループ化されたデータで集計関数を使用して、合計、平均、カウントなどの値を計算します。

データのグループ化に使用されるデータ列を定義するには、LinqDataSource コントロールの GroupBy プロパティを設定します。集計関数を使用する場合は、集計関数を定義するために、Select プロパティの値も指定します。

Bb470251.alert_note(ja-jp,VS.90).gifメモ :

操作しているデータがグループ化されている場合、レコードを更新、挿入、または削除することはできません。

1 列を基準にしたデータのグループ化と集計

GroupBy プロパティに列を指定することで、1 列を基準にしてデータをグループ化できます。

1 列を基準にしてグループ化と集計を行うには

  1. LinqDataSource コントロールの ContextTypeName をデータ ソースに設定します。

  2. TableName プロパティを、グループ化するデータを含むデータ ソース オブジェクト内のプロパティに設定します。

  3. GroupBy プロパティを、データのグループ化に使用する列に設定します。

  4. 集計関数とデータのグループ化に使用される列を含むように、Select プロパティを設定します。

    GroupBy プロパティで指定されるプロパティは、Key という名前のオブジェクトを使用して取得されます。データ バインド コントロールが集計関数によって作成されたプロパティを参照できるように、As キーワードを使用して、集計関数に名前 (エイリアス) を割り当てる必要があります。集計関数に名前がない場合、LinqDataSourceView オブジェクトは例外を発生させます。

    ProductCategory という名前の列を使用してデータをグループ化し、GridView コントロールを使用して結果を表示する LinqDataSource コントロールの例を次に示します。このコントロールは、Key プロパティを通じて ProductCategory 値を選択します。次に、同じ ProductCategory 値を持つ製品の ListPrice プロパティと Cost プロパティの平均を計算します。また、各 ProductCategory 値のレコードの個数も返します。

    <asp:LinqDataSource 
      ContextTypeName="ExampleDataContext" 
      TableName="Products" 
      GroupBy="ProductCategory"
      Select="new(Key, 
        Average(ListPrice) As AverageListPrice, 
        Average(Cost) As AverageCost, 
        Count() As RecordCount)"
      ID="LinqDataSource1" 
      runat="server">
    </asp:LinqDataSource>
    <asp:GridView 
      DataSourceID="LinqDataSource1" 
      ID="GridView1" 
      runat="server">
    </asp:GridView>
    

複数の列を基準にしたグループ化と集計

複数の列を基準にしてデータをグループ化するには、GroupBy プロパティを設定するときに new 関数を使用する必要があります。

複数の列を基準にしてグループ化するには

  1. 前の手順の説明に従って、ContextTypeName プロパティと TableName プロパティを設定します。

  2. new(column1, column2) のような構文を使用して、GroupBy プロパティを設定します。column1 と column2 は、データのグループ化に使用する列の名前です。必要な数だけ列を指定できます。

  3. Key プロパティと必要な集計関数を含むように、Select プロパティを設定します。

    2 つの列を基準にしてグループ化するように構成され、DataList コントロールに結果を表示する LinqDataSource コントロールの例を次に示します。Key オブジェクトには、ProductCategory プロパティと Color プロパティが含まれます。

    <asp:LinqDataSource 
      ContextTypeName="ExampleDataContext" 
      TableName="Products" 
      GroupBy="new(ProductCategory,Color)"
      Select="new(Key,
        Average(ListPrice) as AverageListPrice, 
        Count() as RecordCount)"
      ID="LinqDataSource1" 
      runat="server">
    </asp:LinqDataSource>
    <asp:DataList 
      DataSourceID="LinqDataSource1" 
      ID="DataList1" 
      runat="server">
      <ItemTemplate>
        <%# Eval("Key.ProductCategory") %> 
        <%# Eval("Key.Color") %> 
        <%# Eval("AverageListPrice") %> 
        <%# Eval("RecordCount") %> 
      </ItemTemplate>
    </asp:DataList>
    

個別のレコードの取得 (データのグループ化時)

1 つ以上の列を基準にしてデータをグループ化した場合、It キーワードを使用することで、各グループ内の個別のレコードを取得できます。このキーワードは、データ オブジェクトの現在のインスタンスを表します。返されるデータには、グループ化されたデータと、グループに属するレコードの両方が含まれます。

グループ化されたデータと個別のレコードを取得して表示するには

  1. LinqDataSource コントロールの ContextTypeName プロパティと TableName プロパティを設定します。

  2. GroupBy プロパティを、データのグループ化に使用する列に設定します。

  3. It キーワードと必要な集計関数を含むように、Select プロパティを設定します。It キーワードで表されるオブジェクトの名前を、As キーワードに変更する必要があります。

    2 つの列を基準にしてグループ化するように構成された LinqDataSource コントロールの例を次に示します。Key プロパティは、ProductCategory プロパティと Color プロパティを持つオブジェクトを参照します。It で表されるオブジェクトの名前は、Products に変更されます。名前を変更された Products オブジェクトには、グループ内の個別のレコードのコレクションが含まれます。各インスタンスには、Products テーブルのすべての列が含まれます。

    <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>
    

    グループ化されたデータと、そのグループに属する製品の個別の名前を表示する 2 つの ListView コントロールの例を次に示します。入れ子になったデータ バインド コントロールの DataSource プロパティは Products に設定されます。これは、it オブジェクトのエイリアスです。

    <asp:ListView 
      DataSourceID="LinqDataSource1" 
      ID="ListView1" 
      runat="server">
    
      <LayoutTemplate>
        <table 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>
          <tbody runat="server" id="itemContainer">
          </tbody>
        </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">
            <asp:ListView 
              DataSource='<%# Eval("Products") %>' 
              runat="server" 
              ID="ListView2">
    
              <LayoutTemplate>
                <div 
                  style=" width:100%;background-color:White;color:Black" 
                  runat="server" 
                  id="itemContainer">
                </div>
              </LayoutTemplate>
    
              <ItemTemplate>
                <%# Eval("ProductName") %><br />
              </ItemTemplate>
    
            </asp:ListView> 
          </td>
        </tr>
      </ItemTemplate>
    </asp:ListView>
    

参照

概念

LinqDataSource Web サーバー コントロールの概要