다음을 통해 공유


LinqDataSource 웹 서버 컨트롤 개요

업데이트: 2007년 11월

LinqDataSource 컨트롤은 ASP.NET 데이터 소스 컨트롤 아키텍처를 통해 웹 개발자에게 LINQ(통합 언어 쿼리)를 제공합니다. LINQ에서는 여러 유형의 데이터 소스에서 데이터를 쿼리하고 업데이트하기 위한 통합 프로그래밍 모델을 제공하고 데이터 기능을 직접 C# 및 Visual Basic 언어로 확장합니다. LINQ에서는 관계형 데이터에 개체 지향 프로그래밍의 원칙을 적용하여 개체 지향 프로그래밍과 관계형 데이터 간의 상호 작용을 간단하게 만듭니다. LINQ에 대한 자세한 내용은 LINQ(통합 언어 쿼리)를 참조하십시오.

선언 태그를 사용하면 배열과 같은 메모리 내 데이터 컬렉션이나 데이터베이스의 데이터에 연결되는 LinqDataSource 컨트롤을 만들 수 있습니다. 선언 텍스트에서 데이터를 검색, 필터링, 정렬 및 그룹화하는 데 필요한 모든 조건을 쓸 수 있습니다. SQL 데이터베이스 테이블의 데이터를 검색하는 경우에는 데이터 업데이트, 삽입 및 삭제를 처리하도록 LinqDataSource 컨트롤을 구성할 수도 있습니다. 이러한 작업을 수행하기 위한 SQL 명령을 작성하지 않아도 컨트롤에서 이 작업을 수행합니다. 또한 LinqDataSource 클래스에서는 사용자 지정된 시나리오를 처리할 수 있는 이벤트 모델을 제공합니다.

이 항목의 내용은 다음과 같습니다.

  • 시나리오

  • 배경

  • 코드 예제

  • 클래스 참조

시나리오

데이터를 검색하거나 수정하는 웹 페이지를 만들 때 LINQ에서 제공하는 통합 프로그래밍 모델을 사용하려는 경우 LinqDataSource 컨트롤을 사용합니다. LinqDataSource 컨트롤을 통해 데이터와 상호 작용하는 명령을 자동으로 만들어 웹 페이지의 코드를 간단하게 만들 수 있습니다.

맨 위로 이동

배경

LinqDataSource 컨트롤을 사용하면 데이터 컨트롤을 다양한 데이터 소스에 연결할 수 있습니다. 이러한 데이터 소스에는 데이터베이스 데이터, 데이터 소스 클래스 및 메모리 내 컬렉션이 포함됩니다. LinqDataSource 컨트롤을 사용하면 이러한 모든 데이터 소스 유형에 대해 데이터베이스와 유사한 검색 작업(선택, 필터링, 그룹화 및 정렬)을 지정할 수 있습니다. 데이터베이스 테이블에 대해서는 수정 작업(업데이트, 삭제 및 삽입)을 지정할 수 있습니다.

공용 필드나 속성에 저장된 모든 종류의 데이터 컬렉션에 LinqDataSource 컨트롤을 연결할 수 있습니다. 데이터 작업을 수행하는 선언 태그와 코드는 모든 데이터 소스에 대해 동일합니다. 따라서 데이터베이스 테이블의 데이터나 배열과 같은 데이터 컬렉션의 데이터와 상호 작용할 때 다른 구문을 사용할 필요가 없습니다.

LinqDataSource 컨트롤에 대한 소개는 연습: LinqDataSource 및 DetailsView 컨트롤에서 정보 검색, 업데이트, 삽입 및 삭제를 참조하십시오.

데이터베이스의 데이터에 연결

데이터베이스의 데이터와 상호 작용할 때 LinqDataSource 컨트롤을 데이터베이스에 직접 연결하지 않습니다. 대신 데이터베이스 및 테이블을 나타내는 엔터티 클래스와 상호 작용합니다. 개체 관계형 디자이너를 사용하거나 SqlMetal.exe 유틸리티를 실행하여 엔터티 클래스를 생성할 수 있습니다. 자세한 내용은 O/R 디자이너(개체 관계형 디자이너) 또는 코드 생성 도구(SqlMetal.exe)를 참조하십시오. 작성된 엔터티 클래스는 일반적으로 웹 응용 프로그램의 App_Code 폴더에 배치됩니다. O/R 디자이너 또는 SqlMetal.exe 유틸리티에서는 데이터베이스를 나타내는 클래스 하나와 데이터베이스의 각 테이블에 대한 클래스 하나를 생성합니다.

데이터베이스를 나타내는 클래스는 데이터 소스의 값을 검색하고 설정하는 작업을 담당합니다. LinqDataSource 컨트롤은 데이터 테이블을 나타내는 클래스에서 속성을 읽고 설정합니다. 업데이트, 삽입 및 삭제 작업을 지원하려면 데이터베이스 클래스가 DataContext 클래스에서 파생되고 테이블 클래스가 Table<TEntity> 클래스를 참조해야 합니다.

ContextTypeName 속성을 데이터베이스를 나타내는 클래스 이름으로 설정하여 LinqDataSource 컨트롤을 데이터베이스 클래스에 연결합니다. TableName 속성을 데이터 테이블을 나타내는 클래스 이름으로 설정하여 LinqDataSource 컨트롤을 특정 테이블에 연결합니다. 예를 들어 AdventureWorks 데이터베이스의 Contacts 테이블에 연결하려면 ContextTypeName 속성을 AdventureWorksDataContext 또는 데이터베이스 개체에 대해 지정하는 임의의 이름으로 설정합니다. TableName 속성을 Contacts로 설정합니다. 다음 예제에서는 AdventureWorks 데이터베이스에 연결하는 LinqDataSource 컨트롤의 태그를 보여 줍니다.

<asp:LinqDataSource 
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Contacts" 
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>

이 예제에서는 생성된 코드가 너무 길어 이 항목에 적합하지 않으므로 O/R 디자이너에서 생성된 클래스가 표시되어 있지 않습니다. 그러나 생성된 코드가 있어야만 예제가 작동됩니다. 자세한 내용은 LINQ to SQL의 코드 생성을 참조하십시오.

메모리 내 컬렉션의 데이터에 연결

배열과 같은 메모리 내 데이터 컬렉션에 연결하는 경우 ContextTypeName 속성을 컬렉션이 포함된 클래스의 이름으로 설정합니다. TableName 속성은 컬렉션 자체의 이름으로 설정합니다.

다음 예제에서는 문자열 값 배열을 포함하는 클래스를 보여 줍니다.

Public Class MovieLibrary
    Dim _availableGenres() As String = {"Comedy", "Drama", "Romance"}

    Public ReadOnly Property AvailableGenres() As String()
        Get
            Return _availableGenres
        End Get
    End Property

End Class
public class MovieLibrary
{
    string[] _availableGenres = { "Comedy", "Drama", "Romance" };

    public MovieLibrary()
    {
    }

    public string[] AvailableGenres
    {
        get
        {
            return _availableGenres;
        }
    }
}

다음 예제에서는 이전 예제의 클래스에서 영화 장르 목록을 읽는 LinqDataSource 컨트롤을 보여 줍니다. 장르 배열을 검색하려면 ContextTypeName 속성을 MovieLibrary로 설정하고 TableName 속성을 AvailableGenres로 설정합니다.

<asp:LinqDataSource 
    ContextTypeName="MovieLibrary" 
    TableName="AvailableGenres" 
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>

데이터 바인딩된 컨트롤에서 LinqDataSource 컨트롤 사용

LinqDataSource 컨트롤의 데이터를 표시하려면 데이터 바인딩된 컨트롤을 LinqDataSource 컨트롤에 바인딩합니다. 예를 들어 DetailsView 컨트롤, GridView 컨트롤 또는 ListView 컨트롤을 LinqDataSource 컨트롤에 바인딩할 수 있습니다. 이렇게 하려면 데이터 바인딩된 컨트롤의 DataSourceID 속성을 LinqDataSource 컨트롤의 ID로 설정합니다. 다음 예제에서는 LinqDataSource 컨트롤의 모든 데이터를 표시하는 GridView 컨트롤을 보여 줍니다.

<asp:LinqDataSource 
    
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Contacts" 
    ID="LinqDataSource1">
</asp:LinqDataSource>
<asp:GridView 
    ID="GridView1" 
    
    DataSourceID="LinqDataSource1" >
</asp:GridView>

데이터 바인딩된 컨트롤은 LinqDataSource 컨트롤의 데이터를 표시하는 데 필요한 사용자 인터페이스를 자동으로 만듭니다. 또한 데이터 정렬 및 페이징을 위한 인터페이스를 제공할 수 있습니다. 데이터 수정 기능을 사용할 수 있는 경우 데이터 바인딩된 컨트롤에서는 레코드 업데이트, 삽입 및 삭제를 위한 인터페이스를 제공합니다.

데이터 컨트롤 필드를 자동으로 생성하지 않도록 데이터 바인딩된 컨트롤을 구성하여 표시되는 데이터(속성)를 제한할 수 있습니다. 그런 다음 데이터 바인딩된 컨트롤에서 이러한 필드를 명시적으로 정의할 수 있습니다. LinqDataSource 컨트롤은 모든 속성을 검색하지만 데이터 바인딩된 컨트롤은 지정하는 속성만 표시합니다. 다음 예제에서는 AdventureWorks 데이터베이스의 Products 테이블에서 Name 및 StandardCost 속성만 표시하는 GridView 컨트롤을 보여 줍니다. AutoGenerateColumns 속성은 false로 설정됩니다.

<asp:LinqDataSource 
    ContextTypeName="AdventureWorksDataContext" 
    TableName="Products" 
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1" 
    AutoGenerateColumns="false"
    ID="GridView1" 
    >
    <Columns>
        <asp:BoundField DataField="Name" />
        <asp:BoundField DataField="StandardCost" />
    </Columns>
</asp:GridView>

쿼리에서 반환되는 속성을 제한해야 하는 경우 LinqDataSource 컨트롤의 Select 속성을 설정하여 이러한 속성을 정의합니다.

LinqDataSource 컨트롤과 기타 데이터 소스 컨트롤 비교

LinqDataSource 컨트롤을 사용하면 SqlDataSource 또는 ObjectDataSource 컨트롤로 작업할 때보다 더 적은 코드를 작성하여 데이터 작업을 수행할 수 있습니다. LinqDataSource 컨트롤에서는 연결하려는 데이터 소스에 대한 정보를 유추할 수 있고 데이터를 선택, 삽입 및 삭제하는 명령을 동적으로 만들 수 있습니다. LinqDataSource 컨트롤을 사용하는 경우 다른 데이터 소스 유형과 상호 작용하기 위해 하나의 프로그래밍 모델만 익히면 됩니다.

SqlDataSource 컨트롤 비교

관계형 데이터베이스 테이블에서만 작동하는 SqlDataSource 컨트롤과 달리 LinqDataSource 컨트롤은 메모리 내 컬렉션에 저장된 데이터에 연결하는 데 사용할 수 있습니다. SqlDataSource 컨트롤을 사용하는 경우에는 SelectCommand, UpdateCommand, InsertCommandDeleteCommand 속성을 SQL 쿼리로 명시적으로 설정해야 합니다. 그러나 LinqDataSource 컨트롤에서는 이러한 명령을 명시적으로 설정할 필요가 없습니다. LinqDataSource 컨트롤에서는 LINQ to SQL을 사용하여 이러한 명령을 자동으로 만듭니다. 데이터 소스에서 선택하는 열을 수정하려는 경우 전체 SQL Select 명령을 작성할 필요가 없습니다. 대신 쿼리에서 반환할 열의 이름을 Select 속성에 지정합니다.

데이터를 업데이트하거나 삽입하는 경우 데이터베이스에 저장할 모든 값의 매개 변수를 만들 필요가 없습니다. LinqDataSource 컨트롤에서는 DataField 속성을 엔터티 클래스의 속성 이름에 일치시켜 적절한 값을 포함하는 업데이트 명령을 만들 수 있습니다.

ObjectDataSource 컨트롤 비교

ObjectDataSource 컨트롤을 사용하는 경우에는 데이터를 나타내는 개체를 수동으로 만들고 이 데이터와 상호 작용하기 위한 메서드를 작성해야 합니다. 그런 다음 SelectMethod, UpdateMethod, InsertMethodDeleteMethod 속성을 이러한 기능을 수행하는 메서드에 일치시켜야 합니다. LinqDataSource 컨트롤에서 O/R 디자이너를 사용하면 데이터를 나타내는 클래스를 자동으로 만들 수 있습니다. 데이터베이스 테이블에 있는 열을 지정하거나 데이터를 선택, 업데이트, 삽입 및 삭제하는 방법을 지정하는 코드를 작성할 필요가 없습니다. 또한 LinqDataSource 컨트롤을 사용하여 배열 등의 데이터 컬렉션과 직접 상호 작용할 수 있습니다. 이 경우 데이터 컬렉션과 상호 작용하는 논리를 처리하는 클래스를 만들 필요가 없습니다.

데이터 선택

LinqDataSource 컨트롤의 Select 속성 값을 지정하지 않으면 데이터 소스 클래스의 모든 속성이 검색됩니다. 예를 들어 LinqDataSource 컨트롤은 데이터베이스 테이블에 있는 각 열의 값을 반환합니다.

Select 속성을 원하는 속성 이름으로 설정하여 데이터 소스에서 검색하는 속성을 제한할 수 있습니다. 하나의 속성만 반환하려면 Select 속성을 해당 속성으로 설정합니다. 예를 들어 데이터베이스 테이블에서 City 열의 값만 반환하려면 Select 속성을 City로 설정합니다. LinqDataSource 컨트롤은 속성에서 올바르게 입력된 항목을 포함하는 List<T> 컬렉션을 반환합니다. City 속성이 텍스트(문자열)로 입력된 경우 City 속성을 선택하면 문자열 값의 List<T> 컬렉션이 반환됩니다.

데이터 클래스에서 일부 속성만 검색하려면 Select 속성에 new 함수를 사용하고 반환할 열을 지정합니다. 지정한 속성만 포함하는 클래스를 동적으로 만들 것이므로 new 함수가 필요합니다. 예를 들어 전체 주소를 포함하는 데이터 소스에서 City 및 PostalCode 속성을 검색하려면 Select 속성을 new(City, PostalCode)로 설정합니다. LinqDataSource 컨트롤은 이러한 속성을 포함하는 클래스의 인스턴스가 포함된 List<T> 컬렉션을 반환합니다.

하나의 속성만 선택하는 경우에는 반환되는 개체가 해당 속성 값의 단순한 컬렉션이므로 new 함수를 사용할 필요가 없습니다. 그러나 여러 속성의 경우에는 LinqDataSource 컨트롤이 사용자가 지정하는 속성을 포함하는 새 클래스를 만들어야 합니다.

Select 절에서 값 계산

Select 절에서 값을 계산할 수 있습니다. 예를 들어 주문의 품목 총계를 계산하려면 Select 속성을 new(SalesOrderDetailID, OrderQty * UnitPrice As LineItemTotal)로 설정합니다. As 키워드를 사용하면 계산된 값에 이름(별칭)을 할당할 수 있습니다. 자세한 내용은 연습: LinqDataSource 및 GridView 컨트롤을 사용하여 데이터의 하위 집합 선택 및 필터링을 참조하십시오.

다음 예제에서는 LinqDataSource 컨트롤을 사용하여 데이터 하위 집합을 검색하는 방법을 보여 줍니다. 이 예제에서는 반환된 값에 별칭을 지정하고 값을 계산하도록 Select 속성을 설정합니다.

<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="OrderDetails" 
    Select="new(SalesOrderDetailID As DetailID, 
      OrderQty * UnitPrice As LineItemTotal, 
      DateCreated As SaleDate)"
    ID="LinqDataSource1" 
    >
</asp:LinqDataSource>

Where 절을 사용하여 데이터 필터링

반환된 값을 필터링하여 특정 조건에 맞는 레코드만 검색할 수 있습니다. 이렇게 하려면 Where 속성을 레코드가 반환되는 데이터에 포함되기 위해 충족해야 하는 조건으로 설정합니다. Where 속성 값을 지정하지 않으면 데이터 소스의 모든 레코드가 검색됩니다. 비교를 사용하여 레코드를 포함할지 여부를 결정하는 필터 식을 만들어 필터링합니다. 비교 대상은 정적 값이나 매개 변수 자리 표시자에 지정하는 변수 값이 될 수 있습니다.

정적 값을 사용하여 Where 절 만들기

속성 값을 정적 값과 비교하려는 경우 속성과 정적 값을 사용하여 Where 속성을 정의합니다. 예를 들어 ListPrice 값이 1000보다 큰 레코드만 반환하려면 Where 속성을 ListPrice > 1000으로 설정합니다.

논리 AND를 위한 && 또는 and 연산자 및 논리 OR을 위한 || 또는 or 연산자를 사용할 수 있습니다. 예를 들어 Where 속성을 ListPrice > 1000 || UnitCost > 500 || DaysToManufacture > 3으로 설정하여 ListPrice 값이 1000보다 크거나 UnitCost 값이 500보다 크거나 DaysToManufacture 값이 3보다 큰 레코드를 반환할 수 있습니다. 모든 조건이 충족되어야만 레코드를 반환하도록 지정하려면 Where 속성을 ListPrice > 1000 && UnitCost > 500 && DaysToManufacture > 3으로 설정합니다.

문자열 값을 비교할 때는 조건을 작은따옴표로 묶고 리터럴 값을 큰따옴표로 묶어야 합니다. 예를 들어 Category 열이 "Sports"와 동일한 레코드만 검색하려면 Where 속성을 'Category = "Sports"'로 설정합니다.

다음 예제에서는 문자열 값과 숫자 값으로 필터링한 데이터를 검색하는 LinqDataSource 컨트롤을 보여 줍니다.

<asp:LinqDataSource
  ContextTypeName="ExampleDataContext"
  TableName="Product"
  Where='Category = "Sports" && Weight < 10'
  ID="LinqDataSource1"
  
</asp:LinqDataSource>

매개 변수가 있는 Where 절 만들기

속성 값을 런타임에만 알려지는 값과 비교하려면 WhereParameters 속성 컬렉션에서 매개 변수를 정의합니다. 예를 들어 사용자가 지정한 값을 사용하여 필터링하려면 값을 나타내는 매개 변수를 만듭니다. LinqDataSource 컨트롤은 매개 변수의 현재 값을 사용하여 Where 절을 만듭니다.

다음 예제에서는 DropDownList1이라는 컨트롤에서 사용자가 선택한 항목을 기준으로 데이터를 검색하는 LinqDataSource 컨트롤을 보여 줍니다.

<asp:DropDownList AutoPostBack="true" ID="DropDownList1" >
  <asp:ListItem Value="Sports">Sports</asp:ListItem>
  <asp:ListItem Value="Garden">Garden</asp:ListItem>
  <asp:ListItem Value="Auto">Auto</asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    AutoGenerateWhereClause="true"
    ID="LinqDataSource1" 
    >
  <WhereParameters>
    <asp:ControlParameter 
      Name="Category" 
      ControlID="DropDownList1" 
      Type="String" />
  </WhereParameters>
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    >
</asp:GridView>

AutoGenerateWhereClause 속성을 true로 설정하면 LinqDataSource 컨트롤에서 자동으로 Where 절을 만듭니다. 여러 매개 변수가 있는 경우 이 옵션을 사용하면 Where 속성에서 각 조건을 지정할 필요가 없으므로 편리합니다. 대신 WhereParameters 속성 컬렉션에 매개 변수를 추가하면 LinqDataSource 컨트롤에서 각 매개 변수를 포함하는 Where 절을 만듭니다.

AutoGenerateWhereClause 속성을 true로 설정할 경우 매개 변수의 이름이 해당 속성의 이름과 일치해야 합니다. 예를 들어 매개 변수 값을 Category 속성과 비교하려면 매개 변수의 이름을 Category로 지정해야 합니다. 모든 비교에서는 같은지만 확인하므로 값이 매개 변수 값보다 크거나 작은지는 테스트할 수 없습니다. WhereParameters 컬렉션에 두 개 이상의 매개 변수를 지정하면 매개 변수가 논리 AND로 연결됩니다.

같지 않은지 확인하거나 조건을 논리 OR로 연결하려면 AutoGenerateWhereClause 속성을 false로 설정합니다. 그런 다음 Where 속성에서 조건을 정의할 수 있습니다. Where 속성에 각 매개 변수의 자리 표시자를 넣습니다.

다음 예제에서는 데이터를 필터링할 때 같지 않은지 테스트하는 방법을 보여 줍니다.

<asp:DropDownList 
    AutoPostBack="true" 
    ID="DropDownList1" 
    >
  <asp:ListItem Value="0">0</asp:ListItem>
  <asp:ListItem Value="25">25</asp:ListItem>
  <asp:ListItem Value="100">100</asp:ListItem>
  <asp:ListItem Value="400">400</asp:ListItem>
</asp:DropDownList>
<asp:LinqDataSource 
    ContextTypeName="ExampleDataContext" 
    TableName="Products" 
    Where="Price > @UserPrice"
    ID="LinqDataSource1" 
    >
  <WhereParameters>
    <asp:ControlParameter 
      Name="UserPrice" 
      DefaultValue="0" 
      ControlID="DropDownList1" 
      Type="Int32" />
  </WhereParameters>
</asp:LinqDataSource>
<asp:GridView 
    DataSourceID="LinqDataSource1"
    ID="GridView1" 
    >
</asp:GridView>

자세한 내용은 AutoGenerateWhereClause를 참조하십시오.

데이터 그룹화 및 집계

하나 이상의 열에 공통 값을 가지는 레코드의 데이터를 통합하기 위해 데이터를 그룹화할 수 있습니다. 이렇게 하려면 GroupBy 속성을 데이터를 통합하는 데 사용할 속성의 이름으로 설정합니다. 예를 들어 주소 정보를 포함하는 테이블에서 구/군/시 값이 같은 레코드를 그룹화하려면 GroupBy를 City로 설정합니다.

GroupBy 속성과 함께 집계 함수를 사용하면 그룹화한 데이터에서 속성의 평균이나 합계와 같은 값을 계산할 수 있습니다. Key 개체를 참조하여 그룹화에 사용된 값을 검색합니다.

다음 예제에서는 ProductCategory라는 속성의 데이터를 그룹화하는 방법을 보여 줍니다. 그리고 이렇게 그룹화된 값은 Select 속성에 Key 키를 추가하여 검색됩니다. Average 및 Count 집계 메서드도 Select 속성에 포함합니다.

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

It 키워드를 사용하여 그룹에 속한 개별 레코드를 검색할 수 있습니다. 자세한 내용은 방법: LinqDataSource 컨트롤을 사용하여 데이터 그룹화 및 집계를 참조하십시오.

집계 메서드

다음 표에서는 LinqDataSource 컨트롤을 사용할 때 제공되는 집계 메서드를 보여 줍니다.

집계 함수

설명

Count()

데이터 집합의 총 레코드 수를 반환합니다.

Average(column)

반환된 모든 레코드에 대해 지정한 열의 평균 값을 반환합니다.

Sum(column)

반환된 모든 레코드에 대해 지정한 열의 값을 모두 더한 값을 반환합니다.

Max(column)

반환된 모든 레코드에 대해 지정한 열의 최대 값을 반환합니다.

Min(column)

반환된 모든 레코드에 대해 지정한 열의 최소 값을 반환합니다.

Where(condition)

반환된 레코드를 지정한 조건을 기준으로 필터링합니다.

Any()

컬렉션에 임의의 레코드가 있는지 여부를 확인합니다.

All(condition)

컬렉션의 모든 레코드가 지정한 조건에 맞는지 여부를 확인합니다.

데이터 업데이트, 삽입 및 삭제

데이터 업데이트, 삽입 및 삭제 명령을 자동으로 만들도록 LinqDataSource 컨트롤을 구성할 수 있습니다. 자동 데이터 업데이트를 사용하려면 EnableUpdate, EnableInsert 또는 EnableDelete 속성을 true로 설정합니다.

참고:

LinqDataSource 컨트롤에서 업데이트 명령을 자동으로 생성하도록 하는 경우 Select 속성을 설정할 수 없습니다. Select 속성을 설정하면 LinqDataSource 컨트롤에서는 동적 클래스의 인스턴스인 개체를 반환합니다. 이 개체는 데이터베이스 테이블을 나타내는 클래스의 인스턴스가 아닙니다. 따라서 동적 클래스에서는 데이터베이스 테이블의 값을 업데이트하는 방법을 유추할 수 없습니다.

업데이트할 값을 프로그래밍 방식으로 설정하려면 Updating, Inserting 또는 Deleting 이벤트에 대한 이벤트 처리기를 만듭니다. 이 처리기에서는 데이터 작업이 시작되기 전에 값을 설정할 수 있습니다. 자세한 내용은 방법: LinqDataSource 컨트롤을 사용하여 데이터 업데이트, 삽입 및 삭제를 참조하십시오.

데이터 정렬

LinqDataSource 개체에서는 쿼리에서 데이터를 정렬하는 두 가지 방법을 지원합니다. 즉, 웹 페이지를 개발할 때 정적 값을 기준으로 데이터를 정렬할 수 있습니다. 또한 사용자가 런타임에 동적으로 데이터를 정렬하도록 할 수 있습니다.

데이터를 정적 값에 따라 정렬하려면 OrderBy 속성에 속성 이름을 할당합니다. 사용자가 런타임에 데이터를 정렬하도록 하려면 AutoSort 속성을 true(기본값)로 설정합니다. 그런 다음 정렬 식을 LinqDataSource 컨트롤에 전달합니다. GridView 컨트롤과 같은 데이터 바인딩된 컨트롤은 해당 AllowSorting 속성을 true로 설정하면 정렬 식을 전달합니다.

OrderBy 속성에 두 개 이상의 열 이름을 지정하려면 열 이름을 쉼표로 구분합니다. 예를 들어 "LastName, FirstName"을 지정하면 레코드가 처음에 LastName별로 정렬된 다음 LastName 필드에 일치하는 값이 포함된 레코드가 FirstName별로 정렬됩니다.

우선 특정 순서로 데이터를 반환한 다음 사용자가 해당 순서를 변경할 수 있도록 하려는 경우 두 가지 정렬 방법을 모두 사용할 수 있습니다. 이 경우 AutoSort 속성을 true로 설정하고 OrderBy 속성을 속성의 이름으로 설정합니다.

다음 예제에서는 처음에 레코드를 LastName별로 정렬한 다음 차례대로 FirstName 및 MiddleName별로 정렬하는 LinqDataSource 컨트롤을 보여 줍니다. 또한 이 LinqDataSource 컨트롤은 사용자가 행을 동적으로 정렬할 수 있도록 구성됩니다. GridView 컨트롤과 같은 데이터 컨트롤을 LinqDataSource 컨트롤에 바인딩하여 데이터를 표시하고 사용자가 정렬 순서를 지정할 수 있도록 구성할 수 있습니다.

<asp:LinqDataSource
  ContextTypeName="ExampleDataContext"
  TableName="Contact"
  OrderBy="LastName, FirstName, MiddleName"
  AutoSort="true"
  ID="LinqDataSource1"
  
</asp:LinqDataSource>

매개 변수를 사용하여 값을 동적으로 계산

LinqDataSource 컨트롤을 사용할 경우 매개 변수를 통해 런타임에 해석하거나 변환해야 하는 값을 지정합니다. 다른 데이터 소스 컨트롤을 사용할 때와 달리 업데이트, 삽입 또는 삭제 작업의 일부인 각 값을 지정할 필요가 없습니다. LinqDataSource 컨트롤에서 자동으로 이러한 값을 설정하고 LINQ to SQL을 사용하여 SQL 명령을 생성합니다. 사용자는 기본값을 지정하거나 빈 값을 변환하는 매개 변수만 지정합니다. 또한 WhereParametersOrderByParameters 매개 변수 컬렉션을 사용하여 런타임에 값을 기준으로 데이터를 정렬하거나 필터링할 수 있습니다. LINQ to SQL에 대한 자세한 내용은 LINQ to SQL을 참조하십시오.

LinqDataSource 컨트롤에는 다음과 같은 매개 변수 컬렉션이 포함되어 있습니다.

WhereParameters 컬렉션을 사용하여 사용자가 LinqDataSource 컨트롤에서 반환된 레코드를 동적으로 필터링할 수 있도록 하는 방법에 대한 예제는 이 항목 앞 부분의 Where 절을 사용하여 데이터 필터링을 참조하십시오.

동시성 제어

사용자가 데이터를 업데이트하거나 삭제할 수 있도록 하는 경우 업데이트나 삭제를 계속하기 전에 데이터 소스의 데이터가 다른 프로세스에 의해 변경되지 않았는지 확인할 수 있습니다. 값이 변경되었는지 여부를 확인하지 않는 경우 다른 프로세스에서 설정한 값을 실수로 덮어쓸 수 있으며 데이터가 일관성이 없는 상태가 될 수 있습니다.

LinqDataSource 컨트롤을 사용하여 데이터가 변경되었는지 여부를 확인할 수 있습니다. 이 컨트롤에서는 원래 데이터 값을 웹 페이지의 뷰 상태에 저장합니다. 웹 페이지를 포스트백하면 페이지에 원래 값과 업데이트된 값이 모두 포함됩니다. LinqDataSource 컨트롤에서는 LINQ to SQL을 사용하여 원래 값과 데이터 소스의 현재 값을 비교합니다. 값이 동일하면 데이터가 변경되지 않은 것이므로 LINQ to SQL에서 값을 업데이트하거나 삭제합니다. 데이터가 변경된 경우에는 LINQ to SQL에서 예외가 발생합니다.

엔터티 클래스의 열에 대해 UpdateCheck 속성을 설정하여 확인할 열 값을 수동으로 지정할 수 있습니다. O/R 디자이너에서는 데이터베이스 테이블의 코드를 생성할 때 데이터베이스에서 관리하는 열에 대해 UpdateCheck 속성을 Never로 설정합니다. 다른 모든 열의 값은 Always로 설정되므로 동시성 검사에 항상 포함됩니다. 해당 열이 동시성 검사에 포함되지 않게 하려면 UpdateCheck 속성을 Never로 설정합니다. 또한 이 속성을 Never로 설정하면 해당 열의 값이 뷰 상태에 저장되지 않습니다. 사용자가 값을 변경했을 때만 데이터 소스와 비교하여 값을 검사하려면 UpdateCheck 속성을 WhenChanged로 설정합니다.

중요한 데이터를 뷰 상태에 저장해야 하는 경우에는 뷰 상태를 암호화해야 합니다. 자세한 내용은 Encrypt ViewState in ASP.NET 2.0을 참조하십시오.

참고:

뷰 상태를 암호화하면 웹 페이지 성능에 영향을 줄 수 있습니다.

SQL Server 데이터의 동시성 검사 최적화

여러 개의 값을 뷰 상태에 저장하면 웹 페이지의 크기가 늘어나고 중요한 데이터가 사용자에게 노출될 수 있습니다. SQL Server 데이터베이스의 데이터를 사용하는 경우 데이터베이스에서 타임스탬프 값을 포함하는 열을 만들어 웹 페이지의 성능과 보안을 개선할 수 있습니다. SQL Server에서는 레코드가 수정될 때마다 타임스탬프 열을 자동으로 업데이트합니다. 이 경우 LinqDataSource 컨트롤에서 레코드의 각 열을 비교하여 레코드가 변경되었는지 여부를 확인하지 않아도 됩니다. 대신 뷰 상태의 타임스탬프만 데이터베이스의 타임스탬프와 비교할 수 있습니다.

SQL Server 데이터베이스에 타임스탬프 열을 추가하면 O/R 디자이너에서는 타임스탬프만 뷰 상태에 저장되도록 엔터티 클래스를 자동으로 만듭니다. 자세한 내용은 연습: LinqDataSource 컨트롤에서 타임스탬프를 사용하여 데이터 무결성 검사를 참조하십시오.

저장 프로시저 사용

LinqDataSource 컨트롤을 사용하여 저장 프로시저에서 데이터를 검색하려면 Selecting 이벤트에 대한 처리기를 만들어야 합니다. 이벤트 처리기에서 저장 프로시저를 나타내는 데이터 컨텍스트 클래스의 메서드를 호출합니다. 그런 다음 저장 프로시저의 결과를 LinqDataSourceSelectEventArgs 개체의 Result 속성으로 설정합니다. 자동 업데이트, 삽입 및 삭제 작업을 활성화하려면 메서드를 통해 반환되는 형식이 TableName 속성에 지정된 형식과 일치해야 합니다.

다음 예제에서는 저장 프로시저를 나타내는 메서드를 통해 반환되는 개체에 Result 속성을 할당하는 방법을 보여 줍니다.

Protected Sub LinqDataSource_Selecting(ByVal sender As Object, _
        ByVal e As LinqDataSourceSelectEventArgs)
    Dim exampleContext As ExampleDataContext = New ExampleDataContext()
    e.Result = exampleContext.GetRegisteredCustomers()
End Sub
protected void LinqDataSource_Selecting(object sender, 
        LinqDataSourceSelectEventArgs e)
{
    ExampleDataContext exampleContext = new ExampleDataContext();
    e.Result = exampleContext.GetRegisteredCustomers();
}

데이터 컨텍스트 메서드를 만드는 데 대한 자세한 내용은 방법: 저장 프로시저 및 함수에 매핑된 DataContext 메서드 만들기(O/R 디자이너)를 참조하십시오.

데이터를 수정할 때 값 유효성 검사

데이터 레코드를 수정하려면 먼저 값의 유효성을 검사해야 할 수도 있습니다. 일반적으로 유효성 검사는 웹 페이지가 아니라 데이터 클래스에 포함합니다. 유효성 검사 작업을 데이터 클래스에서 중앙 집중화하여 처리하면 데이터 클래스의 사용 방식과 상관없이 유효성 검사를 수행할 수 있습니다. 클래스에 유효성 검사를 추가하는 방법에 대한 자세한 내용은 방법: 엔터티 클래스에 유효성 검사 추가연습: 엔터티 클래스에 유효성 검사 추가를 참조하십시오.

데이터가 업데이트, 삽입 또는 삭제되기 전에 유효성 검사 예외가 throw됩니다. Inserting, UpdatingDeleting 이벤트에 대한 처리기를 만들면 유효성 검사 예외를 검색할 수 있습니다. 자세한 내용은 LinqDataSourceUpdateEventArgs, LinqDataSourceInsertEventArgsLinqDataSourceDeleteEventArgs 클래스를 참조하십시오.

LinqDataSource 컨트롤 이벤트

LinqDataSource 컨트롤에서는 사용자가 데이터를 선택, 삽입, 업데이트 또는 삭제하는 방식을 사용자 지정할 수 있도록 처리 도중 특정 시점에 이벤트를 발생시킵니다.

데이터를 선택하는 경우 LinqDataSource 컨트롤에서는 다음과 같은 이벤트를 아래 순서대로 발생시킵니다.

  1. Selecting

  2. ContextCreating(필요한 경우)

  3. ContextCreated(필요한 경우)

  4. Selected

  5. ContextDisposing

Selecting 이벤트에서 컨텍스트 개체를 프로그래밍 방식으로 만들고 원래 값을 뷰 상태에 저장할 필요가 없는 경우 ContextCreatingContextCreated 이벤트를 건너뜁니다.

데이터를 업데이트, 삽입 또는 삭제하는 경우 LinqDataSource 컨트롤에서는 다음과 같은 이벤트를 아래 순서대로 발생시킵니다.

  1. ContextCreating

  2. ContextCreated

  3. Inserting, Updating 또는 Deleting

  4. Inserted, Updated 또는 Deleted

  5. ContextDisposing

업데이트, 삭제 및 삽입 작업의 이벤트 순서는 선택 작업의 이벤트 순서와 다릅니다. 이는 LinqDataSource 컨트롤에서 데이터 개체의 인스턴스를 가져와 해당 인스턴스를 Inserting, Updating 또는 Deleting 이벤트로 전달하기 때문입니다.

Selecting, Inserting, UpdatingDeleting 이벤트는 데이터 작업이 실행되기 전에 발생합니다. 이러한 이벤트에 대한 이벤트 처리기를 만들어 작업 전에 값의 유효성을 검사하고 값을 수정하거나 작업을 취소할 수 있습니다. 예를 들어 데이터베이스에 레코드를 마지막으로 수정한 사용자를 저장하는 열이 포함되어 있는 경우 Updating 이벤트를 사용하여 사용자 이름 값을 프로그래밍 방식으로 설정할 수 있습니다.

The Selected, Inserted, UpdatedDeleted 이벤트는 작업이 완료된 후에 발생합니다. 이러한 이벤트에 대한 이벤트 처리기를 만들어 예외를 catch하고 작업에서 반환된 값을 검사할 수 있습니다.

ContextCreating 이벤트는 LinqDataSource 컨트롤에서 ContextTypeName 속성에 지정된 형식을 만들기 전에 발생합니다. 컨텍스트 형식을 프로그래밍 방식으로 만들려는 경우에 이 이벤트를 처리합니다. 예를 들어 컨텍스트 형식의 생성자 메서드에 매개 변수가 필요한 경우에 이렇게 할 수 있습니다. ContextCreated 이벤트는 ContextTypeName 속성에 지정한 형식이 만들어진 후에 발생합니다. 이 이벤트를 처리하여 예외를 catch하거나 생성된 컨텍스트 개체를 검사할 수 있습니다. ContextDisposing 이벤트는 LinqDataSource 컨트롤에서 ContextTypeName 속성에서 지정한 컨텍스트 형식을 삭제하기 전에 발생합니다. 시간이나 리소스 면에서 만드는 데 비용이 많이 드는 개체의 삭제를 취소하려면 이 이벤트를 처리합니다. 또한 개체를 소멸시키기 전에 이 이벤트를 사용하여 개체와 관련된 정리 작업을 수행할 수 있습니다.

맨 위로 이동

코드 예제

연습: LinqDataSource 및 DetailsView 컨트롤에서 정보 검색, 업데이트, 삽입 및 삭제

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

연습: LinqDataSource 컨트롤에서 타임스탬프를 사용하여 데이터 무결성 검사

방법: LinqDataSource 컨트롤을 사용하여 데이터 그룹화 및 집계

방법: LinqDataSource 컨트롤을 사용하여 데이터 업데이트, 삽입 및 삭제

맨 위로 이동

클래스 참조

다음 표에서는 LinqDataSource 클래스와 관련된 주요 클래스를 보여 줍니다.

멤버

설명

LinqDataSource

LINQ 식을 데이터 소스에 적용하고 데이터 바인딩된 컨트롤의 데이터를 나타냅니다.

LinqDataSourceView

LinqDataSource 컨트롤을 지원하고 데이터 바인딩된 컨트롤이 데이터 개체에서 데이터 작업을 수행하는 데 필요한 인터페이스를 제공합니다. 이 클래스는 데이터 바인딩된 컨트롤에서 주로 사용되며, 페이지 코드에서 프로그래밍 가능한 개체로 사용되지는 않습니다.

LinqDataSourceDisposeEventArgs

ContextDisposing 이벤트에 대한 데이터를 제공합니다.

LinqDataSourceContextEventArgs

ContextCreating 이벤트에 대한 데이터를 제공합니다.

LinqDataSourceDeleteEventArgs

Deleting 이벤트에 대한 데이터를 제공합니다.

LinqDataSourceInsertEventArgs

Inserting 이벤트에 대한 데이터를 제공합니다.

LinqDataSourceSelectEventArgs

Selecting 이벤트에 대한 데이터를 제공합니다.

LinqDataSourceStatusEventArgs

ContextCreated, Deleted, Inserted, SelectedUpdated 이벤트에 대한 데이터를 제공합니다.

LinqDataSourceUpdateEventArgs

Updating 이벤트에 대한 데이터를 제공합니다.

맨 위로 이동

참고 항목

기타 리소스

LINQ(통합 언어 쿼리)

LINQ to SQL

O/R 디자이너(개체 관계형 디자이너)