다음을 통해 공유


연습: LinqDataSource 및 GridView 컨트롤을 사용하여 데이터의 하위 집합 선택 및 필터링

업데이트: 2007년 11월

이 연습에서는 LinqDataSource 컨트롤을 사용하여 단일 데이터베이스 테이블의 값에 제한되지 않는 데이터 집합을 만드는 방법을 설명합니다. LinqDataSource 컨트롤을 사용하여 테이블의 데이터 하위 집합을 선택하고 선택한 값에서 새 값을 계산하며 관련 테이블에서 값을 검색합니다. 또한 반환되는 레코드를 필터링합니다. 그런 다음 GridView 컨트롤을 사용하여 새 값 집합을 표시합니다.

연습에서는 AdventureWorks 샘플 데이터베이스에 있는 Product 테이블에서 기본적으로 값을 선택하여 데이터 액세스를 설명합니다. Product 테이블에는 다른 테이블에 대한 외래 키인 열이 있고 해당 관련 테이블에서 데이터를 검색합니다.

개체 관계형 디자이너를 사용하여 값이 포함된 데이터베이스 테이블을 나타내는 클래스를 만듭니다. LinqDataSource 컨트롤은 이렇게 생성된 클래스와 상호 작용하여 데이터를 검색하고 업데이트합니다.

사전 요구 사항

이 연습의 절차를 구현하려면 다음이 필요합니다.

  • Visual Studio 2008 또는 Visual Web Developer Express Edition

  • ASP.NET 웹 사이트.

  • SQL Server Express Edition. SQL Server가 설치되어 있으면 이를 사용할 수 있지만 일부 절차를 약간 수정해야 합니다.

  • 사용자 컴퓨터에 설치된 AdventureWorks 데이터베이스. AdventureWorks 데이터베이스를 다운로드하려면 SQL Server 2005 Samples and Sample Databases를 참조하십시오.

  • AdventureWorks 데이터베이스에 연결하는 웹 사이트의 연결 문자열

데이터베이스 엔터티를 나타내는 클래스 만들기

LinqDataSource 컨트롤을 사용하여 데이터베이스 데이터 작업을 수행하려면 데이터베이스 엔터티를 나타내는 클래스를 만들어야 합니다. 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 웹 페이지를 만들고 소스 뷰로 전환합니다.

  2. 도구 상자의 데이터 탭에서 LinqDataSource 컨트롤을 끌어서 웹 페이지의 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 > 0과 같은 정적 값을 사용하여 필터링할 수 있습니다. 또한 매개 변수를 WhereParameters 컬렉션에 추가하여 런타임에 값을 할당할 수 있습니다.

LinqDataSource 컨트롤을 사용하여 런타임에 데이터를 필터링하려면

  1. DropDownList 컨트롤을 웹 페이지에 추가하고 해당 AutoPostBack 속성을 true로 설정합니다.

    기본 이름 DropDownList1을 그대로 둡니다.

  2. 4개의 목록 항목을 DropDownList1 컨트롤에 추가하고 해당 값을 0, 25, 100 및 400으로 설정합니다.

  3. WhereParameters 요소를 LinqDataSource 컨트롤의 여는 태그와 닫는 태그 사이에 추가합니다.

  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 웹 서버 컨트롤 개요