EntityDataSource에 LINQ 쿼리 적용

이 항목에서는 런타임 중에 LINQ 쿼리를 사용하여 EntityDataSource 컨트롤의 데이터를 필터링하는 방법에 대해 설명합니다.

.NET Framework 버전 4부터는 EntityDataSource 컨트롤이 데이터 소스에서 검색한 데이터에 대한 필터를 만드는 데 사용되는 QueryExtender 컨트롤을 지원합니다. 이 QueryExtender 컨트롤은 선언 구문을 사용하여 웹 페이지의 태그에서 데이터를 필터링할 수 있습니다. 자세한 내용은 EntityDataSource에 LINQ 쿼리 적용를 참조하십시오. 또한 EntityDataSource 컨트롤을 사용하면 QueryCreated 이벤트 처리기를 구현하여 EntityDataSource와 연결된 ObjectQuery<T> 맨 위에 LINQ to Entities 쿼리를 프로그래밍 방식으로 적용하여 데이터를 필터링할 수 있습니다. 프로그래밍 방식으로 데이터를 필터링하려면 페이지에 QueryExtender 컨트롤을 추가할 필요가 없습니다. EntityDataSource 컨트롤의[ E:System.Web.UI.WebControls.EntityDataSource.QueryCreated] 이벤트에서 이벤트로 전달된 것과 다른 쿼리를 반환하는 경우 QueryExtender 컨트롤이 만들어집니다.

EntityDataSource.QueryCreated 이벤트 처리기를 구현하여 런타임 중에 추가 필터링을 지정하기 위해 EntityDataSource 컨트롤에 LINQ 쿼리를 설정할 수 있습니다. QueryCreated 이벤트는 EntityDataSource에서 EntityDataSource 컨트롤 구성 중에 지정된 Entity SQL 쿼리 작성을 완료한 후에 발생합니다. EntityDataSource 컨트롤에서 제공된 원래 쿼리의 맨 위에 LINQ 쿼리를 적용하려면 이벤트 처리기로 전달되는 e.Query 매개 변수에 LINQ 쿼리를 할당합니다. e.Query 매개 변수에 할당하는 쿼리의 결과 형식은 컨트롤을 만들 때 지정된 반환 형식과 같은 형식이어야 하며 그렇지 않으면 예외가 발생합니다.

다음 예제에서는 ListBox가 EntityDataSource 컨트롤에 바인딩되고 onquerycreated 이벤트가 EntityDataSource1_QueryCreated 이벤트 처리기에 연결됩니다.

<asp:ListBox ID="ListBox1" runat="server" DataSourceID="EntityDataSource1" 
    DataTextField="SalesOrderID" DataValueField="SalesOrderID"></asp:ListBox>
<asp:EntityDataSource ID="EntityDataSource1" runat="server" 
    ConnectionString="name=AdventureWorksEntities" 
    DefaultContainerName="AdventureWorksEntities" EnableFlattening="False" 
    EntitySetName="SalesOrderHeaders" 
    onquerycreated="EntityDataSource1_QueryCreated">
</asp:EntityDataSource>

QueryCreated 이벤트를 구현하는 이벤트 처리기는 ID가 43661 미만인 주문을 표시하는 EntityDataSource 컨트롤에 LINQ 쿼리를 추가합니다.

protected void EntityDataSource1_QueryCreated(object sender, QueryCreatedEventArgs e)
{
    var orders = e.Query.Cast<SalesOrderHeader>();
    e.Query = from order in orders
        where order.SalesOrderID < 43661
        select order;  
}

EntityDataSource 컨트롤은 Entity SQL 및 LINQ 쿼리가 실행된 후 데이터 바인딩된 ListBox 컨트롤의 정렬 식 및 페이징 식을 데이터에 적용합니다.

결과 정렬은 다음 시퀀스에 따라 적용되는 세 가지 소스를 기반으로 합니다.

  • EntityDataSource OrderBy 또는 AutoGenerateOrderByClause 속성

  • QueryCreated 중에 LINQ 쿼리 또는 QueryExtender에 지정되는 정렬

  • 데이터 바인딩된 컨트롤의 정렬 식에서 요청되는 정렬

쿼리에 적용되는 각각의 새로운 정렬 사양이 이전의 모든 정렬 사양을 재정의하므로 시퀀스의 마지막 정렬 사양만이 결과에 영향을 주며, 이후의 모든 페이징 작업에 적용됩니다.

표시: