Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
oleh Tom Dykstra
Aplikasi web sampel Contoso University menunjukkan cara membuat aplikasi ASP.NET Web Forms menggunakan Entity Framework 4.0 dan Visual Studio 2010. Untuk informasi tentang seri tutorial, lihat tutorial pertama dalam seri
Memfilter, Mengurutkan, dan Mengelompokkan Data
Dalam tutorial sebelumnya Anda menggunakan EntityDataSource
kontrol untuk menampilkan dan mengedit data. Dalam tutorial ini Anda akan memfilter, memesan, dan mengelompokkan data. Saat Anda melakukan ini dengan mengatur properti EntityDataSource
kontrol, sintaksnya berbeda dari kontrol sumber data lainnya. Seperti yang akan Anda lihat, Anda dapat menggunakan QueryExtender
kontrol untuk meminimalkan perbedaan ini.
Anda akan mengubah halaman Students.aspx untuk memfilter siswa, mengurutkan menurut nama, dan mencari nama. Anda juga akan mengubah halaman Courses.aspx untuk menampilkan kursus untuk departemen yang dipilih dan mencari kursus berdasarkan nama. Terakhir, Anda akan menambahkan statistik siswa ke halaman About.aspx .
Menggunakan Properti EntityDataSource "Where" untuk Memfilter Data
Buka halaman Students.aspx yang Anda buat di tutorial sebelumnya. Seperti yang saat ini dikonfigurasi, GridView
kontrol di halaman menampilkan semua nama dari People
kumpulan entitas. Namun, Anda hanya ingin menampilkan siswa, yang dapat Anda temukan dengan memilih Person
entitas yang memiliki tanggal pendaftaran non-null.
Beralih ke tampilan Desain dan pilih EntityDataSource
kontrol. Di jendela Properti , setel properti Where
ke it.EnrollmentDate is not null
.
Sintaks yang Anda gunakan dalam Where
properti EntityDataSource
kontrol adalah Entity SQL. SQL entitas mirip dengan Transact-SQL, tetapi disesuaikan untuk digunakan dengan entitas daripada objek database. Dalam ekspresi it.EnrollmentDate is not null
, kata it
mewakili referensi ke entitas yang dikembalikan oleh kueri. Oleh karena itu, it.EnrollmentDate
mengacu pada EnrollmentDate
properti Person
entitas yang EntityDataSource
dikembalikan kontrol.
Jalankan halaman. Daftar siswa sekarang hanya berisi siswa. (Tidak ada baris yang ditampilkan di mana tidak ada tanggal pendaftaran.)
Menggunakan Properti EntityDataSource "OrderBy" untuk Memesan Data
Anda juga ingin daftar ini dalam urutan nama saat pertama kali ditampilkan. Dengan halaman Students.aspx masih terbuka dalam tampilan Desain , dan dengan EntityDataSource
kontrol masih dipilih, di jendela Properti atur properti OrderBy ke it.LastName
.
Jalankan halaman. Daftar siswa sekarang berurutan menurut nama belakang.
Menggunakan Parameter Kontrol untuk Mengatur Properti "Where"
Seperti halnya kontrol sumber data lainnya, Anda dapat meneruskan nilai parameter ke Where
properti . Pada halaman Courses.aspx yang Anda buat di bagian 2 tutorial, Anda dapat menggunakan metode ini untuk menampilkan kursus yang terkait dengan departemen yang dipilih pengguna dari daftar drop-down.
Buka Courses.aspx dan beralihlah ke tampilan Desain . Tambahkan kontrol kedua EntityDataSource
ke halaman, dan beri CoursesEntityDataSource
nama . Sambungkan ke SchoolEntities
model, dan pilih Courses
sebagai nilai EntitySetName .
Di jendela Properti , klik elipsis di kotak properti Where . (Pastikan CoursesEntityDataSource
kontrol masih dipilih sebelum menggunakan jendela Properti .)
Kotak dialog Editor Ekspresi ditampilkan. Dalam kotak dialog ini, pilih Buat ekspresi Where secara otomatis berdasarkan parameter yang disediakan, lalu klik Tambahkan Parameter. Beri nama parameter DepartmentID
, pilih Kontrol sebagai nilai Sumber parameter , dan pilih DepartemenDropDownList sebagai nilai ControlID .
Klik Perlihatkan properti tingkat lanjut, dan di jendela Properti dari kotak dialog Editor Ekspresi , ubah properti menjadi Type
Int32
.
Setelah selesai, klik OK.
Di bawah daftar drop-down, tambahkan GridView
kontrol ke halaman dan beri CoursesGridView
nama . Sambungkan ke CoursesEntityDataSource
kontrol sumber data, klik Refresh Skema, klik Edit Kolom, dan hapus DepartmentID
kolom.
GridView
Markup kontrol menyerupai contoh berikut.
<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>
Saat pengguna mengubah departemen yang dipilih di daftar drop-down, Anda ingin daftar kursus terkait berubah secara otomatis. Untuk meluaskan hal ini, pilih daftar drop-down, dan di jendela Properti atur AutoPostBack
properti ke True
.
Sekarang setelah Anda selesai menggunakan perancang, beralihlah ke tampilan Sumber dan ganti ConnectionString
properti CoursesEntityDataSource
nama dan DefaultContainer
kontrol dengan ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
atribut . Setelah selesai, markup untuk kontrol akan terlihat seperti contoh berikut.
<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>
Jalankan halaman dan gunakan daftar drop-down untuk memilih departemen yang berbeda. Hanya kursus yang ditawarkan oleh departemen yang dipilih yang ditampilkan dalam GridView
kontrol.
Menggunakan Properti EntityDataSource "GroupBy" untuk Mengelompokkan Data
Misalkan Contoso University ingin menempatkan beberapa statistik tubuh siswa di halaman Tentang. Secara khusus, ia ingin menunjukkan perincian jumlah siswa berdasarkan tanggal mereka mendaftar.
Buka About.aspx, dan dalam tampilan Sumber , ganti konten BodyContent
kontrol yang ada dengan "Statistik Badan Siswa" di antara h2
tag:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Setelah judul, tambahkan EntityDataSource
kontrol dan beri StudentStatisticsEntityDataSource
nama . Sambungkan ke SchoolEntities
, pilih People
kumpulan entitas, dan biarkan kotak Pilih di wizard tidak berubah. Atur properti berikut ini di jendela Properti :
- Untuk memfilter siswa saja, atur properti ke
Where
it.EnrollmentDate is not null
. - Untuk mengelompokkan hasil menurut tanggal pendaftaran, atur properti ke
GroupBy
it.EnrollmentDate
. - Untuk memilih tanggal pendaftaran dan jumlah siswa, atur properti ke
Select
it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents
. - Untuk memesan hasil berdasarkan tanggal pendaftaran, atur properti ke
OrderBy
it.EnrollmentDate
.
Dalam tampilan Sumber , ganti ConnectionString
properti dan DefaultContainer
nama dengan ContextTypeName
properti .
EntityDataSource
Markup kontrol sekarang menyerupai contoh berikut.
<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>
Sintaks properti Select
, GroupBy
, dan Where
menyerubungi Transact-SQL kecuali untuk it
kata kunci yang menentukan entitas saat ini.
Tambahkan markup berikut untuk membuat GridView
kontrol untuk menampilkan 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>
Jalankan halaman untuk melihat daftar yang memperlihatkan jumlah siswa menurut tanggal pendaftaran.
Menggunakan Kontrol QueryExtender untuk Pemfilteran dan Pengurutan
Kontrol QueryExtender
menyediakan cara untuk menentukan pemfilteran dan pengurutan dalam markup. Sintaksnya tidak bergantung pada sistem manajemen database (DBMS) yang Anda gunakan. Ini juga umumnya independen dari Kerangka Kerja Entitas, dengan pengecualian bahwa sintaks yang Anda gunakan untuk properti navigasi unik untuk Kerangka Kerja Entitas.
Di bagian tutorial ini Anda akan menggunakan QueryExtender
kontrol untuk memfilter dan memesan data, dan salah satu bidang order-by akan menjadi properti navigasi.
(Jika Anda lebih suka menggunakan kode alih-alih markup untuk memperluas kueri yang secara otomatis dihasilkan oleh EntityDataSource
kontrol, Anda dapat melakukannya dengan menangani QueryCreated
peristiwa. Ini adalah cara QueryExtender
kontrol memperluas EntityDataSource
kueri kontrol juga.)
Buka halaman Courses.aspx , dan di bawah markup yang Anda tambahkan sebelumnya, sisipkan markup berikut untuk membuat judul, kotak teks untuk memasukkan string pencarian, tombol pencarian, dan EntityDataSource
kontrol yang terikat ke Courses
kumpulan entitas.
<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>
Perhatikan bahwa EntityDataSource
properti kontrol Include
diatur ke Department
. Dalam database, Course
tabel tidak berisi nama departemen; tabel berisi DepartmentID
kolom kunci asing. Jika Anda mengkueri database secara langsung, untuk mendapatkan nama departemen bersama dengan data kursus, Anda harus bergabung dengan Course
tabel dan Department
. Dengan mengatur Include
properti ke Department
, Anda menentukan bahwa Kerangka Kerja Entitas harus melakukan pekerjaan mendapatkan entitas terkait Department
saat mendapatkan Course
entitas. Entitas Department
kemudian disimpan di Department
properti Course
navigasi entitas. (Secara default, SchoolEntities
kelas yang dihasilkan oleh perancang model data mengambil data terkait saat diperlukan, dan Anda telah mengikat kontrol sumber data ke kelas tersebut Include
, sehingga pengaturan properti tidak diperlukan. Namun, mengaturnya meningkatkan performa halaman, karena jika tidak, Kerangka Kerja Entitas akan melakukan panggilan terpisah ke database untuk mengambil data untuk Course
entitas dan untuk entitas terkait Department
.)
Setelah kontrol yang EntityDataSource
baru saja Anda buat, sisipkan markup berikut untuk membuat QueryExtender
kontrol yang terikat ke EntityDataSource
kontrol tersebut.
<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>
Elemen SearchExpression
menentukan bahwa Anda ingin memilih kursus yang judulnya cocok dengan nilai yang dimasukkan dalam kotak teks. Hanya karakter sebanyak yang dimasukkan dalam kotak teks yang akan dibandingkan, karena SearchType
properti menentukan StartsWith
.
Elemen OrderByExpression
menentukan bahwa tataan hasil akan diurutkan berdasarkan judul kursus dalam nama departemen. Perhatikan bagaimana nama departemen ditentukan: Department.Name
. Karena hubungan antara Course
entitas dan Department
entitas bersifat satu-ke-satu, Department
properti navigasi berisi Department
entitas. (Jika ini adalah hubungan satu-ke-banyak, properti akan berisi koleksi.) Untuk mendapatkan nama departemen, Anda harus menentukan Name
properti Department
entitas.
Terakhir, tambahkan GridView
kontrol untuk menampilkan daftar kursus:
<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>
Kolom pertama adalah bidang templat yang menampilkan nama departemen. Ekspresi pengikatan data menentukan Department.Name
, sama seperti yang Anda lihat dalam QueryExtender
kontrol.
Jalankan halaman. Tampilan awal menunjukkan daftar semua kursus dalam urutan berdasarkan departemen dan kemudian berdasarkan judul kursus.
Masukkan "m" dan klik Cari untuk melihat semua kursus yang judulnya dimulai dengan "m" (pencarian tidak peka huruf besar/kecil).
Menggunakan Operator "Suka" untuk Memfilter Data
Anda dapat mencapai efek yang mirip QueryExtender
dengan jenis kontrol StartsWith
, , Contains
dan EndsWith
pencarian dengan menggunakan Like
operator di EntityDataSource
properti kontrol Where
. Di bagian tutorial ini, Anda akan melihat cara menggunakan Like
operator untuk mencari siswa berdasarkan nama.
Buka Students.aspx dalam tampilan Sumber .
GridView
Setelah kontrol, tambahkan markup berikut:
<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>
Markup ini mirip dengan apa yang telah Anda lihat sebelumnya kecuali untuk Where
nilai properti. Bagian kedua dari Where
ekspresi menentukan pencarian substring (LIKE %FirstMidName% or LIKE %LastName%
) yang mencari nama depan dan belakang untuk apa pun yang dimasukkan dalam kotak teks.
Jalankan halaman. Awalnya Anda melihat semua siswa karena nilai default untuk StudentName
parameter adalah "%".
Masukkan huruf "g" di kotak teks dan klik Cari. Anda melihat daftar siswa yang memiliki "g" baik di nama depan atau belakang.
Sekarang Anda telah menampilkan, memperbarui, memfilter, mengurutkan, dan mengelompokkan data dari tabel individual. Dalam tutorial berikutnya Anda akan mulai bekerja dengan data terkait (skenario detail master).