본문 바로가기

Programming/.NET

[ASP.NET] LinqDataSource - Query Parameter 설정

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>