Entity Framework 4.0 Database First 및 ASP.NET 4 Web Forms 시작-3 부Getting Started with Entity Framework 4.0 Database First and ASP.NET 4 Web Forms - Part 3

만든 사람 Tom Dykstraby Tom Dykstra

Contoso 대학 샘플 웹 응용 프로그램은 Entity Framework 4.0 및 Visual Studio 2010를 사용 하 여 ASP.NET Web Forms 응용 프로그램을 만드는 방법을 보여 줍니다.The Contoso University sample web application demonstrates how to create ASP.NET Web Forms applications using the Entity Framework 4.0 and Visual Studio 2010. 자습서 시리즈에 대 한 자세한 내용은 시리즈의 첫 번째 자습서 를 참조 하십시오.For information about the tutorial series, see the first tutorial in the series

데이터 필터링, 정렬 및 그룹화Filtering, Ordering, and Grouping Data

이전 자습서에서는 데이터를 표시 하 고 편집 하는 EntityDataSource 컨트롤을 사용 했습니다.In the previous tutorial you used the EntityDataSource control to display and edit data. 이 자습서에서는 데이터를 필터링, 정렬 및 그룹화 합니다.In this tutorial you'll filter, order, and group data. EntityDataSource 컨트롤의 속성을 설정 하 여이 작업을 수행 하는 경우 구문은 다른 데이터 소스 컨트롤과 다릅니다.When you do this by setting properties of the EntityDataSource control, the syntax is different from other data source controls. 그러나 이러한 차이를 최소화 하기 위해 QueryExtender 컨트롤을 사용할 수 있습니다.As you'll see, however, you can use the QueryExtender control to minimize these differences.

학생을 필터링 하 고 이름을 기준으로 정렬 하 고 이름으로 검색 하려면 학습자 페이지를 변경 합니다.You'll change the Students.aspx page to filter for students, sort by name, and search on name. 또한 코스 .aspx 페이지를 변경 하 여 선택한 부서에 대 한 과정을 표시 하 고 이름으로 과정을 검색 합니다.You'll also change the Courses.aspx page to display courses for the selected department and search for courses by name. 마지막으로 About .aspx 페이지에 학생 통계를 추가 합니다.Finally, you'll add student statistics to the About.aspx page.

Image02Image02

Image11Image11

Image10Image10

Image14Image14

EntityDataSource "Where" 속성을 사용 하 여 데이터 필터링Using the EntityDataSource "Where" Property to Filter Data

이전 자습서에서 만든 학생용 .aspx 페이지를 엽니다.Open the Students.aspx page that you created in the previous tutorial. 현재 구성 된 대로 페이지의 GridView 컨트롤에 People 엔터티 집합의 모든 이름이 표시 됩니다.As currently configured, the GridView control in the page displays all the names from the People entity set. 그러나 null이 아닌 등록 날짜가 있는 엔터티 Person 선택 하 여 찾을 수 있는 학생만 표시 하려고 합니다.However, you want to show only students, which you can find by selecting Person entities that have non-null enrollment dates.

디자인 뷰로 전환 하 고 EntityDataSource 컨트롤을 선택 합니다.Switch to Design view and select the EntityDataSource control. 속성 창에서 Where 속성을 it.EnrollmentDate is not null로 설정합니다.In the Properties window, set the Where property to it.EnrollmentDate is not null.

Image01Image01

EntityDataSource 컨트롤의 Where 속성에서 사용 하는 구문은 Entity SQL입니다.The syntax you use in the Where property of the EntityDataSource control is Entity SQL. Entity SQL는 Transact-sql과 유사 하지만 데이터베이스 개체가 아닌 엔터티에서 사용 하도록 사용자 지정 됩니다.Entity SQL is similar to Transact-SQL, but it's customized for use with entities rather than database objects. it.EnrollmentDate is not null에서 it 단어는 쿼리에서 반환 되는 엔터티에 대 한 참조를 나타냅니다.In the expression it.EnrollmentDate is not null, the word it represents a reference to the entity returned by the query. 따라서 it.EnrollmentDateEntityDataSource 컨트롤이 반환 하는 Person 엔터티의 EnrollmentDate 속성을 참조 합니다.Therefore, it.EnrollmentDate refers to the EnrollmentDate property of the Person entity that the EntityDataSource control returns.

페이지를 실행 합니다.Run the page. 학생 목록에는 이제 학생만 포함 됩니다.The students list now contains only students. 등록 날짜를 표시 하지 않는 행은 표시 되지 않습니다.(There are no rows displayed where there's no enrollment date.)

Image02Image02

EntityDataSource "OrderBy" 속성을 사용 하 여 데이터 정렬Using the EntityDataSource "OrderBy" Property to Order Data

또한이 목록이 처음 표시 될 때 이름 순서로 표시 되도록 합니다.You also want this list to be in name order when it's first displayed. 학습자 페이지가 디자인 뷰에서 열려 있는 상태에서 EntityDataSource 컨트롤을 선택한 상태로 속성 창에서 OrderBy 속성을 it.LastName로 설정 합니다.With the Students.aspx page still open in Design view, and with the EntityDataSource control still selected, in the Properties window set the OrderBy property to it.LastName.

Image05Image05

페이지를 실행 합니다.Run the page. 학생 목록은 이제 성을 기준으로 정렬 됩니다.The students list is now in order by last name.

Image04Image04

컨트롤 매개 변수를 사용 하 여 "Where" 속성 설정Using a Control Parameter to Set the "Where" Property

다른 데이터 소스 컨트롤과 마찬가지로 Where 속성에 매개 변수 값을 전달할 수 있습니다.As with other data source controls, you can pass parameter values to the Where property. 자습서의 2 부에서 만든 과정 .aspx 페이지에서이 방법을 사용 하 여 사용자가 드롭다운 목록에서 선택한 부서와 관련 된 과정을 표시할 수 있습니다.On the Courses.aspx page that you created in part 2 of the tutorial, you can use this method to display courses that are associated with the department that a user selects from the drop-down list.

코스 .aspx 를 열고 디자인 뷰로 전환 합니다.Open Courses.aspx and switch to Design view. 페이지에 두 번째 EntityDataSource 컨트롤을 추가 하 고 이름을 CoursesEntityDataSource에 추가 합니다.Add a second EntityDataSource control to the page, and name it CoursesEntityDataSource. SchoolEntities 모델에 연결 하 고 EntitySetName 값으로 Courses를 선택 합니다.Connect it to the SchoolEntities model, and select Courses as the EntitySetName value.

속성 창의 Where 속성 상자에서 줄임표를 클릭 합니다.In the Properties window, click the ellipsis in the Where property box. 속성 창을 사용 하기 전에 CoursesEntityDataSource 컨트롤이 계속 선택 되어 있는지 확인 합니다.(Make sure the CoursesEntityDataSource control is still selected before using the Properties window.)

Image06Image06

식 편집기 대화 상자가 표시 됩니다.The Expression Editor dialog box is displayed. 이 대화 상자에서 제공 된 매개 변수를 기반으로 Where 식 자동 생성을 선택 하 고 매개 변수 추가를 클릭 합니다.In this dialog box, select Automatically generate the Where expression based on the provided parameters, and then click Add Parameter. 매개 변수의 이름을 DepartmentID하 고 Control매개 변수 원본 값으로 선택 하 고 DepartmentsDropDownListControlID 값으로 선택 합니다.Name the parameter DepartmentID, select Control as the Parameter source value, and select DepartmentsDropDownList as the ControlID value.

Image07Image07

고급 속성 표시를 클릭 하 고 식 편집기 대화 상자의 속성 창에서 Type 속성을 Int32로 변경 합니다.Click Show advanced properties, and in the Properties window of the Expression Editor dialog box, change the Type property to Int32.

Image15Image15

완료되면 확인을 클릭합니다.When you're done, click OK.

드롭다운 목록 아래에서 페이지에 GridView 컨트롤을 추가 하 고 이름을 CoursesGridView로 표시 합니다.Below the drop-down list, add a GridView control to the page and name it CoursesGridView. CoursesEntityDataSource 데이터 소스 컨트롤에 연결 하 고, 스키마 새로 고침을 클릭 하 고, 열 편집을 클릭 하 고, DepartmentID 열을 제거 합니다.Connect it to the CoursesEntityDataSource data source control, click Refresh Schema, click Edit Columns, and remove the DepartmentID column. GridView 컨트롤 태그는 다음 예제와 유사 합니다.The GridView control markup resembles the following example.

<asp:GridView ID="CoursesGridView" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="CourseID" DataSourceID="CoursesEntityDataSource">
        <Columns>
            <asp:BoundField DataField="CourseID" HeaderText="ID" ReadOnly="True" 
                SortExpression="CourseID" />
            <asp:BoundField DataField="Title" HeaderText="Title" SortExpression="Title" />
            <asp:BoundField DataField="Credits" HeaderText="Credits" 
                SortExpression="Credits" />
        </Columns>
    </asp:GridView>

사용자가 드롭다운 목록에서 선택한 부서를 변경 하는 경우 관련 과정 목록이 자동으로 변경 되는 것을 볼 수 있습니다.When the user changes the selected department in the drop-down list, you want the list of associated courses to change automatically. 이렇게 하려면 드롭다운 목록을 선택 하 고 속성 창에서 AutoPostBack 속성을 True로 설정 합니다.To make this happen, select the drop-down list, and in the Properties window set the AutoPostBack property to True.

Image08Image08

이제 디자이너 사용을 완료 했으므로 원본 뷰로 전환 하 고 CoursesEntityDataSource 컨트롤의 ConnectionStringDefaultContainer name 속성을 ContextTypeName="ContosoUniversity.DAL.SchoolEntities" 특성으로 바꿉니다.Now that you're finished using the designer, switch to Source view and replace the ConnectionString and DefaultContainer name properties of the CoursesEntityDataSource control with the ContextTypeName="ContosoUniversity.DAL.SchoolEntities" attribute. 완료 되 면 컨트롤의 태그는 다음 예제와 같이 표시 됩니다.When you're done, the markup for the control will look like the following example.

<asp:EntityDataSource ID="CoursesEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="false"
        EntitySetName="Courses" 
        AutoGenerateWhereClause="true" Where="">
        <WhereParameters>
            <asp:ControlParameter ControlID="DepartmentsDropDownList" Type="Int32" 
                Name="DepartmentID" PropertyName="SelectedValue" />
        </WhereParameters>
    </asp:EntityDataSource>

페이지를 실행 하 고 드롭다운 목록을 사용 하 여 다른 부서를 선택 합니다.Run the page and use the drop-down list to select different departments. 선택한 부서에서 제공 하는 강좌가 GridView 컨트롤에 표시 됩니다.Only courses that are offered by the selected department are displayed in the GridView control.

Image09Image09

EntityDataSource "GroupBy" 속성을 사용 하 여 데이터 그룹화Using the EntityDataSource "GroupBy" Property to Group Data

Contoso 대학이 정보 페이지에 몇 가지 학생 통계를 추가 하려고 한다고 가정 합니다.Suppose Contoso University wants to put some student-body statistics on its About page. 특히 등록 된 날짜별로 학생 수의 분석을 표시 하려고 합니다.Specifically, it wants to show a breakdown of numbers of students by the date they enrolled.

Default.aspx를 열고 소스 뷰에서 BodyContent 컨트롤의 기존 내용을 h2 태그 간에 "학생 본문 통계"로 바꿉니다.Open About.aspx, and in Source view, replace the existing contents of the BodyContent control with "Student Body Statistics" between h2 tags:

<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
    <h2>Student Body Statistics</h2>
</asp:Content>

제목 뒤에 EntityDataSource 컨트롤을 추가 하 고 이름을 StudentStatisticsEntityDataSource로 이름을로 합니다.After the heading, add an EntityDataSource control and name it StudentStatisticsEntityDataSource. SchoolEntities에 연결 하 고, People 엔터티 집합을 선택 하 고, 마법사에서 선택 상자를 변경 되지 않은 상태로 둡니다.Connect it to SchoolEntities, select the People entity set, and leave the Select box in the wizard unchanged. 속성 창에서 다음 속성을 설정 합니다.Set the following properties in the Properties window:

  • 학생용 으로만 필터링 하려면 Where 속성을 it.EnrollmentDate is not null로 설정 합니다.To filter for students only, set the Where property to it.EnrollmentDate is not null.
  • 등록 날짜를 기준으로 결과를 그룹화 하려면 GroupBy 속성을 it.EnrollmentDate로 설정 합니다.To group the results by the enrollment date, set the GroupBy property to it.EnrollmentDate.
  • 등록 날짜와 학생 수를 선택 하려면 Select 속성을 it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents로 설정 합니다.To select the enrollment date and the number of students, set the Select property to it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents.
  • 등록 날짜를 기준으로 결과를 정렬 하려면 OrderBy 속성을 it.EnrollmentDate로 설정 합니다.To order the results by the enrollment date, set the OrderBy property to it.EnrollmentDate.

소스 뷰에서 ConnectionStringDefaultContainer name 속성을 ContextTypeName 속성으로 바꿉니다.In Source view, replace the ConnectionString and DefaultContainer name properties with a ContextTypeName property. 이제 EntityDataSource 컨트롤 태그는 다음 예제와 유사 합니다.The EntityDataSource control markup now resembles the following example.

<asp:EntityDataSource ID="StudentStatisticsEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
        EntitySetName="People"
        Select="it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents" 
        OrderBy="it.EnrollmentDate" GroupBy="it.EnrollmentDate"
        Where="it.EnrollmentDate is not null" >
    </asp:EntityDataSource>

Select, GroupByWhere 속성의 구문은 현재 엔터티를 지정 하는 it 키워드를 제외 하 고 Transact-sql과 비슷합니다.The syntax of the Select, GroupBy, and Where properties resembles Transact-SQL except for the it keyword that specifies the current entity.

다음 태그를 추가 하 여 데이터를 표시 하는 GridView 컨트롤을 만듭니다.Add the following markup to create a GridView control to display the data.

<asp:GridView ID="StudentStatisticsGridView" runat="server" AutoGenerateColumns="False" 
        DataSourceID="StudentStatisticsEntityDataSource">
        <Columns>
            <asp:BoundField DataField="EnrollmentDate" DataFormatString="{0:d}" 
                HeaderText="Date of Enrollment" 
                ReadOnly="True" SortExpression="EnrollmentDate" />
            <asp:BoundField DataField="NumberOfStudents" HeaderText="Students" 
                ReadOnly="True" SortExpression="NumberOfStudents" />
        </Columns>
    </asp:GridView>

페이지를 실행 하 여 등록 날짜별 학생 수를 보여 주는 목록을 표시 합니다.Run the page to see a list showing the number of students by enrollment date.

Image10Image10

필터링 및 정렬에 QueryExtender 컨트롤 사용Using the QueryExtender Control for Filtering and Ordering

QueryExtender 컨트롤은 태그에서 필터링 및 정렬을 지정 하는 방법을 제공 합니다.The QueryExtender control provides a way to specify filtering and sorting in markup. 구문은 사용 중인 DBMS (데이터베이스 관리 시스템)와는 독립적입니다.The syntax is independent of the database management system (DBMS) you're using. 또한 일반적으로 Entity Framework와는 독립적 이며 탐색 속성에 사용 하는 구문이 Entity Framework에 고유 합니다.It's also generally independent of the Entity Framework, with the exception that syntax you use for navigation properties is unique to the Entity Framework.

자습서의이 부분에서는 QueryExtender 컨트롤을 사용 하 여 데이터를 필터링 하 고 정렬 하며, order by 필드 중 하나가 탐색 속성이 됩니다.In this part of the tutorial you'll use a QueryExtender control to filter and order data, and one of the order-by fields will be a navigation property.

(태그 대신 코드를 사용 하 여 EntityDataSource 컨트롤에 의해 자동으로 생성 되는 쿼리를 확장 하려는 경우 QueryCreated 이벤트를 처리 하 여 수행할 수 있습니다.(If you prefer to use code instead of markup to extend the queries that are automatically generated by the EntityDataSource control, you can do that by handling the QueryCreated event. QueryExtender 컨트롤이 EntityDataSource 컨트롤 쿼리도 확장 하는 방법입니다.)This is how the QueryExtender control extends EntityDataSource control queries also.)

Default.aspx 페이지를 열고 이전에 추가한 태그 아래에서 다음 태그를 삽입 하 여 머리글, 검색 문자열을 입력할 수 있는 텍스트 상자, 검색 단추 및 Courses 엔터티 집합에 바인딩된 EntityDataSource 컨트롤을 삽입 합니다.Open the Courses.aspx page, and below the markup you added previously, insert the following markup to create a heading, a text box for entering search strings, a search button, and an EntityDataSource control that's bound to the Courses entity set.

<h2>Courses by Name</h2>
    Enter a course name 
    <asp:TextBox ID="SearchTextBox" runat="server"></asp:TextBox>
     <asp:Button ID="SearchButton" runat="server" Text="Search" />
    <br /><br />
    <asp:EntityDataSource ID="SearchEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
        EntitySetName="Courses"  
        Include="Department" >
    </asp:EntityDataSource>

EntityDataSource 컨트롤의 Include 속성이 Department으로 설정 되어 있는지 확인 합니다.Notice that the EntityDataSource control's Include property is set to Department. 데이터베이스에서 Course 테이블에는 부서 이름이 포함 되지 않습니다. DepartmentID 외래 키 열이 포함 되어 있습니다.In the database, the Course table does not contain the department name; it contains a DepartmentID foreign key column. 데이터베이스를 직접 쿼리 하는 경우 과정 데이터와 함께 부서 이름을 가져오려면 CourseDepartment 테이블에 조인 해야 합니다.If you were querying the database directly, to get the department name along with course data, you would have to join the Course and Department tables. Include 속성을 Department로 설정 하면 Entity Framework에서 Course 엔터티를 가져올 때 관련 Department 엔터티를 가져오는 작업을 수행 하도록 지정 합니다.By setting the Include property to Department, you specify that the Entity Framework should do the work of getting the related Department entity when it gets a Course entity. 그런 다음 Department 엔터티는 Course 엔터티의 Department 탐색 속성에 저장 됩니다.The Department entity is then stored in the Department navigation property of the Course entity. 기본적으로 데이터 모델 디자이너에 의해 생성 된 SchoolEntities 클래스는 필요한 경우 관련 데이터를 검색 하 고, 데이터 소스 컨트롤을 해당 클래스에 바인딩한 후에는 Include 속성을 설정 하지 않아도 됩니다.(By default, the SchoolEntities class that was generated by the data model designer retrieves related data when it's needed, and you've bound the data source control to that class, so setting the Include property is not necessary. 그러나이 메서드를 설정 하면 페이지의 성능이 향상 됩니다. 그렇지 않으면 Entity Framework는 데이터베이스에 대 한 별도의 호출을 수행 하 여 Course 엔터티 및 관련 된 Department 엔터티에 대 한 데이터를 검색 합니다.However, setting it improves performance of the page, because otherwise the Entity Framework would make separate calls to the database to retrieve data for the Course entities and for the related Department entities.)

방금 만든 EntityDataSource 컨트롤 뒤에 다음 태그를 삽입 하 여 해당 EntityDataSource 컨트롤에 바인딩되는 QueryExtender 컨트롤을 만듭니다.After the EntityDataSource control you just created, insert the following markup to create a QueryExtender control that's bound to that EntityDataSource control.

<asp:QueryExtender ID="SearchQueryExtender" runat="server" 
        TargetControlID="SearchEntityDataSource" >
        <asp:SearchExpression SearchType="StartsWith" DataFields="Title">
            <asp:ControlParameter ControlID="SearchTextBox" />
        </asp:SearchExpression>
        <asp:OrderByExpression DataField="Department.Name" Direction="Ascending">
            <asp:ThenBy DataField="Title" Direction="Ascending" />            
        </asp:OrderByExpression>
    </asp:QueryExtender>

SearchExpression 요소는 제목이 텍스트 상자에 입력 한 값과 일치 하는 과정을 선택 하도록 지정 합니다.The SearchExpression element specifies that you want to select courses whose titles match the value entered in the text box. SearchType 속성이 StartsWith를 지정 하기 때문에 텍스트 상자에 입력 된 문자 수만 비교 됩니다.Only as many characters as are entered in the text box will be compared, because the SearchType property specifies StartsWith.

OrderByExpression 요소는 결과 집합을 부서 이름 내의 과정 제목별로 정렬 하도록 지정 합니다.The OrderByExpression element specifies that the result set will be ordered by course title within department name. 부서 이름 지정 방법: Department.Name.Notice how department name is specified: Department.Name. Course 엔터티와 Department 엔터티 간의 연결은 일 대 일 이므로 Department 탐색 속성은 Department 엔터티를 포함 합니다.Because the association between the Course entity and the Department entity is one-to-one, the Department navigation property contains a Department entity. 이 관계가 일 대 다 관계인 경우 속성은 컬렉션을 포함 합니다. 부서 이름을 가져오려면 Department 엔터티의 Name 속성을 지정 해야 합니다.(If this were a one-to-many relationship, the property would contain a collection.) To get the department name, you must specify the Name property of the Department entity.

마지막으로, GridView 컨트롤을 추가 하 여 과정 목록을 표시 합니다.Finally, add a GridView control to display the list of courses:

<asp:GridView ID="SearchGridView" runat="server" AutoGenerateColumns="False" 
        DataKeyNames="CourseID" DataSourceID="SearchEntityDataSource"  AllowPaging="true">
        <Columns>
            <asp:TemplateField HeaderText="Department">
                <ItemTemplate>
                    <asp:Label ID="Label2" runat="server" Text='<%# Eval("Department.Name") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:BoundField DataField="CourseID" HeaderText="ID"/>
            <asp:BoundField DataField="Title" HeaderText="Title" />
            <asp:BoundField DataField="Credits" HeaderText="Credits" />
        </Columns>
    </asp:GridView>

첫 번째 열은 부서 이름을 표시 하는 템플릿 필드입니다.The first column is a template field that displays the department name. 데이터 바인딩 식은 QueryExtender 컨트롤에서 살펴본 것 처럼 Department.Name를 지정 합니다.The databinding expression specifies Department.Name, just as you saw in the QueryExtender control.

페이지를 실행 합니다.Run the page. 초기 표시에서는 부서별로 모든 과정의 목록을 표시 한 다음 코스 제목별로 표시 됩니다.The initial display shows a list of all courses in order by department and then by course title.

Image11Image11

"M"을 입력 하 고 검색 을 클릭 하 여 제목이 "m"으로 시작 하는 모든 과정을 확인 합니다 (검색은 대/소문자를 구분 하지 않음).Enter an "m" and click Search to see all courses whose titles begin with "m" (the search is not case sensitive).

Image12Image12

"Like" 연산자를 사용 하 여 데이터 필터링Using the "Like" Operator to Filter Data

Like 컨트롤의 EntityDataSource 속성에서 Where 연산자를 사용 하 여 QueryExtender 컨트롤의 StartsWith, ContainsEndsWith 검색 형식과 비슷한 효과를 달성할 수 있습니다.You can achieve an effect similar to the QueryExtender control's StartsWith, Contains, and EndsWith search types by using a Like operator in the EntityDataSource control's Where property. 자습서의이 부분에서는 Like 연산자를 사용 하 여 이름별로 학생을 검색 하는 방법을 알아봅니다.In this part of the tutorial, you'll see how to use the Like operator to search for a student by name.

소스 뷰에서 학습자 를 엽니다.Open Students.aspx in Source view. GridView 컨트롤 뒤에 다음 태그를 추가 합니다.After the GridView control, add the following markup:

<h2>Find Students by Name</h2>
    Enter any part of the name
    <asp:TextBox ID="SearchTextBox" runat="server" AutoPostBack="true"></asp:TextBox>
     <asp:Button ID="SearchButton" runat="server" Text="Search" />
    <br />
    <br />
    <asp:EntityDataSource ID="SearchEntityDataSource" runat="server" 
        ContextTypeName="ContosoUniversity.DAL.SchoolEntities" EnableFlattening="False" 
        EntitySetName="People"
        Where="it.EnrollmentDate is not null and (it.FirstMidName Like '%' + @StudentName + '%' or it.LastName Like '%' + @StudentName + '%')" >
        <WhereParameters>
            <asp:ControlParameter ControlID="SearchTextBox" Name="StudentName" PropertyName="Text" 
             Type="String" DefaultValue="%"/>
        </WhereParameters>
    </asp:EntityDataSource>
    <asp:GridView ID="SearchGridView" runat="server" AutoGenerateColumns="False" DataKeyNames="PersonID"
        DataSourceID="SearchEntityDataSource" AllowPaging="true">
        <Columns>
            <asp:TemplateField HeaderText="Name" SortExpression="LastName, FirstMidName">
                <ItemTemplate>
                    <asp:Label ID="LastNameFoundLabel" runat="server" Text='<%# Eval("LastName") %>'></asp:Label>, 
                    <asp:Label ID="FirstNameFoundLabel" runat="server" Text='<%# Eval("FirstMidName") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
            <asp:TemplateField HeaderText="Enrollment Date" SortExpression="EnrollmentDate">
                <ItemTemplate>
                    <asp:Label ID="EnrollmentDateFoundLabel" runat="server" Text='<%# Eval("EnrollmentDate", "{0:d}") %>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField>
        </Columns>
    </asp:GridView>

이 태그는 Where 속성 값을 제외 하 고 앞에서 살펴본 것과 비슷합니다.This markup is similar to what you've seen earlier except for the Where property value. Where 식의 두 번째 부분에서는 텍스트 상자에 입력 된 항목에 대해 성과 이름을 모두 검색 하는 부분 문자열 검색 (LIKE %FirstMidName% or LIKE %LastName%)을 정의 합니다.The second part of the Where expression defines a substring search (LIKE %FirstMidName% or LIKE %LastName%) that searches both the first and last names for whatever is entered in the text box.

페이지를 실행 합니다.Run the page. StudentName 매개 변수의 기본값은 "%" 이므로 처음에는 모든 학생이 표시 됩니다.Initially you see all of the students because the default value for the StudentName parameter is "%".

Image13Image13

텍스트 상자에 문자 "g"를 입력 하 고 검색을 클릭 합니다.Enter the letter "g" in the text box and click Search. 첫 번째 또는 마지막 이름에 "g"가 있는 학생의 목록이 표시 됩니다.You see a list of students that have a "g" in either the first or last name.

Image14Image14

이제 개별 테이블에서 데이터를 표시, 업데이트, 필터링, 정렬 및 그룹화 했습니다.You've now displayed, updated, filtered, ordered, and grouped data from individual tables. 다음 자습서에서는 관련 데이터를 사용 하 여 작업을 시작 합니다 (마스터-세부 시나리오).In the next tutorial you'll begin to work with related data (master-detail scenarios).