'LinqDataSource'에 해당되는 글 4건

Programming/.NET
SQL 데이터베이스에 직접적으로 연결하여 쿼리를 처리하는 SqlDataSource 컨트롤과는 달리 LinqDataSource 는 대상이 되는 DB 데이터를 객체화 하여 LINQ 를 통해 처리할 수 있도록 하는 컨트롤입니다.

LinqDataSource 컨트롤을 사용하기 전에 우선 LINQ to SQL 을 통해 다루고자 하는 데이터의 Data Context 클래스를 생성하여야 합니다.

프로젝트에서 마우스 오른쪽 버튼을 눌러 Add -> New Item 을 선택합니다.


Add New Item 화면에서 왼쪽 Data 카테고리를 선택하고 오른쪽 LINQ to SQL Classes 항목을 선택한 뒤 Add 버튼을 눌러줍니다. 이때 이름(Name)은 원하는대로 지정해도 됩니다.

위 단계를 거치고 나면 프로젝트에 .dbml 파일이 생성되고 해당 디자이너 화면이 보여질 것입니다. 이제 데이터 서버에 연결하여 대상이 될 테이블을 가져오도록 하겠습니다.

Visual Studio 의 Server Explorer 에서 Data Connections 을 우클릭 한 다음 Add Connection 메뉴를 선택합니다.


Server Name 에 대상 서버이름이나 IP 등을 입력하고 Log on to the server 에 접속가능한 계정을 설정합니다. 그러면 Select or enter a database name 에 사용가능한 DB 목록이 보여질 것입니다. 해당 목록에서 다루고자 하는 대상이 있는 DB를 선택하고 OK 버튼을 눌러줍니다.


Server Explorer 화면에 방금전 등록한 DB 가 연결되었음을 확인할 수 있습니다. 해당 DB 에서 원하는 테이블을 dbml 디자이너 화면에 끌어다 놓습니다.

dbml 파일을 저장하고 LinqDataSource 를 사용하고자 하는 aspx 페이지의 디자이너화면에서 Visual Studio Toolbox 의 Data 카테고리 안에 있는 LinqDataSource 컨트롤을 마우스로 끌어다 놓습니다.


LinqDataSource 컨트롤의 SmartTag 를 클릭하여 'Configure Data Source' 항목을 선택합니다.


이 화면에서 Choose your context object 에 있는 항목중 데이터소스로 활용하고자 하는(이전 단계에서 생성한) 데이터 컨텍스트 객체를 선택할 수 있으며 여기에는 System.data.Linq.DataContext 클래스 에서 파생된 객체항목이 나열됩니다. 참고로 System.data.Linq.DataContext 클래스는 LINQ to SQL 에 의해 생성된 데이터 컨텍스트 클래스에 해당됩니다.

▶ <그림 1-1>

위 화면은 Choose a Context Object 화면에서 원하는 컨텍스트 객체를 선택하고 'Next' 버튼을 누른 뒤 화면으로 여기에서는 이전에 선택한 객체의 데이터 항목중 실제 바인딩하고자 하는 항목을 선택할 수는 화면입니다. 실제 위 화면에 나오는 항목은 샘플데이터베이스(AdventureWorks2012)의 Person.Person 테이블의 열항목인데 만약 대상 클래스가 DataContext 에서 파생된 클래스가 아닌 다른 클래스의 형태라면 해당 클래스에 있는 배열등의 속성항목등을 볼 수 있게 됩니다.

<그림 1-1>에서 특정 필드를 선택하면 <코드 1-1>과 같이 선택한 필드를 포함한 LINQ 쿼리가 생성될 것입니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (Title, FirstName, MiddleName)" TableName="Persons"></asp:LinqDataSource>
▶<코드 1-1>

실제 <코드 1-1>의 LinqDataSource 를 GridView에 바인딩해 보면 다음과 같은 결과를 볼 수 있습니다.
<asp:GridView ID="GridView1" runat="server" DataSourceID="LinqDataSource1"></asp:GridView>
1 0
Programming/.NET
LinqDataSource 컨트롤 생성시 설정마법사를 통해서도 어느정도의 데이터 필터링을 위한 기능을 제공하지만  QueryExtender 를 사용하면 좀더 다양한 방법으로 데이터 필터링을 수행할 수 있습니다.

QueryExtender 는 다중검색이나 데이터 검색범위, 콤마(,)를 통한 OrderBy 다중필드 처리를 수행할 수 있을 뿐만 아니라 사용자 정의 표현식의 적용도 가능합니다. 아래 표는 현재 사용할 수 있는 필터링 표현식 항목입니다.

 SearchExpression  문자열이나 검색이나 비교를 수행합니다.  특히 SearchType 속성을 사용하면 StartsWith, EndsWith, Contains 를 이용한 검색도 가능합니다. 
 RangeExpression  최소값과 최대값을 지정해 해당 범위의 값을 찾도록 합니다.
 OrderByExpression  데이터를 순차적으로 정렬합니다.
 CustomExpression  사용자 LINQ 표현식을 사용하여 필터링을 수행할 수 있도록 합니다.
 MethodExpression  사용자 LINQ 쿼리를 포함하는 메소드를 지정할 수 있도록 합니다.
 PropertyExpression  특정 컬럼의 속성을 필터링대상으로 처리합니다.
 OfTypeExpression  데이터 타입을 필터링대상으로

QueryExtender 는 IQueryableDataSource 인터페이스를 구현해 LinqDataSource 나 EntityDataSource 컨트롤등 데이터 소스 컨트롤하위에서 작동할 수 있습니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (key as LastName, it as Persons, Sum(EmailPromotion) as Sum_EmailPromotion)" TableName="Persons" GroupBy="LastName" Where="BusinessEntityID <= 100"></asp:LinqDataSource>
<asp:QueryExtender ID="QueryExtender1" runat="server" TargetControlID="LinqDataSource1">
    <asp:SearchExpression DataFields="LastName">
        <asp:QueryStringParameter DefaultValue="Baker" />
    </asp:SearchExpression>
</asp:QueryExtender>
QueryExtender 사용시 필터링을 적용하기 위한 데이터소스컨트롤은 TargetControlID 로 지정하며 하위에 원하는 Expression Type을 추가하여 필터링을 적용합니다.
1 0
Programming/.NET
LinqDataSource 컨트롤도 SqlDataSouce 컨트롤과 마찬가지로 데이터를 업데이트하거나 삭제할때 데이터 동시성확인이 가능합니다.

이를 위해 필요한 속성이 StoreOriginalValuesInViewState 인데 이 값을 true 로 하면 변경되기전 본래의 데이터를 ViewState 에 저장하고 LINQ to SQL 이 변경/삭제된 데이터를 DB에 반영할때 동시성을 확인하게 됩니다.

다만 본래의 데이터를 ViewState 에 저장하게 되면 WebPage 자체의 용량이 증가하여 성능이 저하될 수 있으므로 주의가 필요합니다.

참고로 LinqDataSource 컨트롤은 select, insert, update, delete 의 전/후 이벤트를 발생시킬 수 있습니다. 만약 이들 동작중 예외가 발생하면 예외에 따른 처리를 수행하거나 계속 진행하는 것도 가능합니다.
2 0
Programming/.NET
LinqDataSource 컨트롤 사용시 <그림 1-1>과 같은 과정을 거칠 때

▶ <그림 1-1>

필터링을 위한 Where 절이나 혹은 정렬을 위한 OrderBy, 집계를 위한 GroupBy 절을 추가할 수 있습니다.

 Where

<그림 1-1>에서 Where 버튼을 누르면 Where 절을 위한 설정을 진행할 수 있으며 해당 Parameter 의 조건데이터로 다른 소스컨트롤에서 사용되었던 구문과 같이 Querystring 이나 데이터필드, 세션값등을 설정할 수 있습니다.

▶ <그림 1-2>

<그림 1-2>에서 설정을 완료하고 'Add' 버튼을 누르고 나면 LinqDataSource 컨트롤의 구문은 다음과 같이 바뀌어 있을 것입니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (BusinessEntityID, NameStyle, PersonType, Title, FirstName, MiddleName)" TableName="Persons" Where="FirstName == @FirstName">
    <WhereParameters>
        <asp:QueryStringParameter Name="FirstName" QueryStringField="FN" Type="String" />
    </WhereParameters>
</asp:LinqDataSource>
▶<코드 1-1>

물론 WhereParameters 내용은 얼마든지 추가 가능하며 LinqDataSource 컨트롤의 Where 속성도 그에 따라 변경되어질 것입니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (BusinessEntityID, NameStyle, PersonType, Title, FirstName, MiddleName)" TableName="Persons" Where="FirstName == @FirstName &amp;&amp; LastName == @LastName">
    <WhereParameters>
        <asp:QueryStringParameter Name="FirstName" QueryStringField="FN" Type="String" />
        <asp:SessionParameter Name="LastName" SessionField="LN" Type="String" />
    </WhereParameters>
</asp:LinqDataSource>
▶ <코드 1-2>

이때 Where 속성에서의 query 구문은 임의로 변경할 수 있으며 여러개의 WhereParameters 를 가진다 하더라도 이들 Parameter중 하나만 사용하도록 강제할 수 있습니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (BusinessEntityID, NameStyle, PersonType, Title, FirstName, MiddleName)" TableName="Persons" Where="FirstName == @FirstName">
    <WhereParameters>
        <asp:QueryStringParameter Name="FirstName" QueryStringField="FN" Type="String" />
        <asp:SessionParameter Name="LastName" SessionField="LN" Type="String" />
    </WhereParameters>
</asp:LinqDataSource>
▶ <코드 1-3>

아니면 필요에 따라 Where 절에서 사용된 Parameter 값을 바꾸는 것도 가능합니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (BusinessEntityID, NameStyle, PersonType, Title, FirstName, MiddleName)" TableName="Persons" Where="FirstName == @LastName">
    <WhereParameters>
        <asp:QueryStringParameter Name="FirstName" QueryStringField="FN" Type="String" />
        <asp:SessionParameter Name="LastName" SessionField="LN" Type="String" />
    </WhereParameters>
</asp:LinqDataSource>
▶ <코드 1-4>

WhereParameters 에 나열된 모든 Parameter 들을 별도의 Where 속성(절) 설정없이 그대로 Where 절에 추가하여 사용하고자 한다면 LinqDataSource 컨트롤의 AutoGenerateWhereClause 속성을 true로 하면 됩니다. 이렇게 되면 현재의 Where 속성에 지정된 구문은 무시되고 WhereParameters 에 정의된 각 Parameter 들을 그대로 사용하게 됩니다.

 OrderBy

OrderBy 는 Query 결과를 Sorting 하기 위한 것이며 <그림 1-1> 에서 OrderBy 버튼을 누름으로서 설정이 가능합합니다.

▶ <그림 2-1>

이때 설정과 결과는 LinqDataSource 컨트롤의 OrderBy 속성으로 추가됩니다.
<asp:LinqDataSource ID="LinqDataSource1" runat="server" AutoGenerateWhereClause="True" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (BusinessEntityID, NameStyle, PersonType, Title, FirstName, MiddleName)" TableName="Persons" OrderBy="FirstName"></asp:LinqDataSource>
▶ <코드 2-1>

만약 <그림 2-1> 에서 여러개의 필드가 OrderBy 항목으로 설정된 경우 각 필드들은 , 로 구분됩니다. (참고로 OrderBy 도 Where 절과 마찬가지로 OrderByParameters 항목을 생성하여 추가가 가능합니다. 다만 이 경우 OrderBy 순서는 해당 Parameter 가 나열된 순서를 따릅니다.

 GroupBy

GroupBy 는 쿼리의 결과에 특정 집계, 예를 들면 Min이나 Max, Sum과 같은 내용을 표현하기 위한 것이며 아래와 같이 원하는 필드를 집계항목으로 설정할 수 있습니다. 물론 필요에 따라 사용자 정의함수를 포함시키는 것도 가능합니다.

▶ <그림 3-1>

<그림 3-1> 에서는 Person 테이블의 LastName별로 EmailPromotion 의 합계를 표시하도록 설정하였습니다.(아무런 의미없는 통계입니다. 여기에 관심을 가지지 마십시오.)

위와 같이 설정하고 나면 LinqDataSource 의 Select 속성은 다음과 같이 작성될 것입니다.(Where 절은 해당 테이블의 갯수가 너무 많아 표시내용을 제한하고자 추가하였습니다.)
<asp:LinqDataSource ID="LinqDataSource1" runat="server" ContextTypeName="Webtest.DataClasses1DataContext" EntityTypeName="" Select="new (key as LastName, it as Persons, Sum(EmailPromotion) as Sum_EmailPromotion)" TableName="Persons" OrderBy="FirstName" GroupBy="LastName" Where="BusinessEntityID <= 100"></asp:LinqDataSource>
aGroupBy를 설정하고 나면 기본적으로 두개의 익명타입 필드가 추가되는데 key 는 실제 표시할 Grouping 대상 필드이며, it 은 Grouping 할 대상 객체 자체를 의미합니다. 간단하게 key 는 GroupBy 속성에 명시된것, it 은 Table 에 명시된것 이라고 보면 되겠습니다.

it 은 Table 이라고 하였으므로 필요하다면 표시할 필드를 Table 에서 추가할 수도 있습니다. 그러기 위해서는 Eval 내장함수를 사용해야 합니다. 예를 들면 GridView에서 데이터를 바인딩 하는 경우 TemplateField 속성을 추가하고 다시 그안에 ItemTemplate 를 추가한뒤 Eval 함수를 사용하면 됩니다.
<asp:GridView ID="GridView1" runat="server" DataSourceID="LinqDataSource1" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" />
        <asp:BoundField DataField="Sum_EmailPromotion" HeaderText="Sum_EmailPromotion" ReadOnly="True" SortExpression="Sum_EmailPromotion" />
        <asp:TemplateField>
            <ItemTemplate>
                <asp:BulletedList DataSource='<%# Eval("Persons") %>' DataTextField="MiddleName" runat="server" ID="BulletedList1"></asp:BulletedList>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
같은 방법으로 key에 대한 접근또한 가능합니다.
<asp:GridView ID="GridView1" runat="server" DataSourceID="LinqDataSource1" AutoGenerateColumns="False">
    <Columns>
        <asp:BoundField DataField="LastName" HeaderText="LastName" ReadOnly="True" SortExpression="LastName" />
        <asp:BoundField DataField="Sum_EmailPromotion" HeaderText="Sum_EmailPromotion" ReadOnly="True" SortExpression="Sum_EmailPromotion" />
        <asp:TemplateField>
            <ItemTemplate>
                <%# Eval("LastName") %>
            </ItemTemplate>
        </asp:TemplateField>
    </Columns>
</asp:GridView>
0 0
1
블로그 이미지

클리엘