Not
Bu sayfaya erişim yetkilendirme gerektiriyor. Oturum açmayı veya dizinleri değiştirmeyi deneyebilirsiniz.
Bu sayfaya erişim yetkilendirme gerektiriyor. Dizinleri değiştirmeyi deneyebilirsiniz.
tarafından Tom Dykstra
Contoso University örnek web uygulaması, Entity Framework 4.0 ve Visual Studio 2010 kullanarak ASP.NET Web Forms uygulamaları oluşturmayı gösterir. Öğretici serisi hakkında bilgi için serideki ilk öğreticiye bakın
Verileri Filtreleme, Sıralama ve Gruplandırma
Önceki öğreticide EntityDataSource
, verileri görüntülemek ve düzenlemek için denetimi kullandınız. Bu öğreticide verileri filtrele, sırala ve gruplandır. Denetimin EntityDataSource
özelliklerini ayarlayarak bunu yaptığınızda söz dizimi diğer veri kaynağı denetimlerinden farklıdır. Ancak göreceğiniz gibi, bu farklılıkları en aza indirmek için denetimi kullanabilirsiniz QueryExtender
.
Öğrenciler için filtre uygulamak, ada göre sıralamak ve ada göre arama yapmak için Students.aspx sayfasını değiştireceksiniz. Ayrıca, seçilen bölüme yönelik kursları görüntülemek ve adlarına göre kursları aramak için Courses.aspx sayfasını da değiştireceksiniz. Son olarak, Öğrenci istatistiklerini About.aspx sayfasına ekleyeceksiniz.
Verileri Filtrelemek için EntityDataSource "Where" Özelliğini Kullanma
Önceki öğreticide oluşturduğunuz Students.aspx sayfasını açın. Şu anda yapılandırıldığı gibi, GridView
sayfadaki denetim varlık kümesindeki People
tüm adları görüntüler. Ancak, yalnızca null olmayan kayıt tarihlerine sahip varlıkları seçerek Person
bulabileceğiniz öğrencileri göstermek istiyorsunuz.
Tasarım görünümüne geçin ve denetimi seçinEntityDataSource
.
Özellikler penceresinde özelliğini olarak it.EnrollmentDate is not null
ayarlayınWhere
.
Denetimin Where
özelliğinde EntityDataSource
kullandığınız söz dizimi Entity SQL'dir. Entity SQL, Transact-SQL'e benzer, ancak veritabanı nesneleri yerine varlıklarla kullanılacak şekilde özelleştirilir. ifadesinde it.EnrollmentDate is not null
, sözcük it
sorgu tarafından döndürülen varlığa bir başvuruyu temsil eder. Bu nedenle, it.EnrollmentDate
denetimin EnrollmentDate
döndürdüğü varlığın Person
özelliğine EntityDataSource
başvurur.
Sayfayı çalıştırın. Öğrenci listesi artık yalnızca öğrencileri içerir. (Kayıt tarihinin olmadığı hiçbir satır görüntülenmez.)
Verileri Sıralamak için EntityDataSource "OrderBy" Özelliğini Kullanma
Ayrıca bu listenin ilk kez görüntülendiğinde ad sırasına uygun olmasını istiyorsunuz.
Students.aspx sayfası Tasarım görünümünde açık durumdayken ve EntityDataSource
denetim seçili durumdayken Özellikler penceresinde OrderBy özelliğini olarak it.LastName
ayarlayın.
Sayfayı çalıştırın. Öğrenci listesi artık soyadına göre sıralanır.
"Where" Özelliğini Ayarlamak için Denetim Parametresi Kullanma
Diğer veri kaynağı denetimlerinde olduğu gibi parametre değerlerini özelliğine Where
geçirebilirsiniz. Öğreticinin 2. bölümünde oluşturduğunuz Courses.aspx sayfasında, bir kullanıcının açılan listeden seçtiği bölümle ilişkili kursları görüntülemek için bu yöntemi kullanabilirsiniz.
Courses.aspx dosyasını açın ve Tasarım görünümüne geçin. Sayfaya ikinci EntityDataSource
bir denetim ekleyin ve adını verin CoursesEntityDataSource
. Modele SchoolEntities
bağlayın ve EntitySetName değeri olarak seçinCourses
.
Özellikler penceresinde, Where özelliği kutusundaki üç noktaya tıklayın. (Özellikler penceresini kullanmadan önce denetimin CoursesEntityDataSource
hala seçili olduğundan emin olun.)
İfade Düzenleyicisi iletişim kutusu görüntülenir. Bu iletişim kutusunda, Sağlanan parametrelere göre Where ifadesini otomatik olarak oluştur'a tıklayın ve ardından Parametre Ekle'ye tıklayın. Parametresini DepartmentID
adlandırın, Parametre kaynak değeri olarak Control'i seçin ve ControlID değeri olarak DepartmentsDropDownList öğesini seçin.
Gelişmiş özellikleri göster'e tıklayın ve İfade Düzenleyicisi iletişim kutusunun Özellikler penceresinde özelliğini olarak Int32
değiştirinType
.
İşiniz bittiğinde, Tamam’a tıklayın.
Açılan listenin altına sayfaya bir GridView
denetim ekleyin ve olarak adlandırın CoursesGridView
. Veri kaynağı denetimine CoursesEntityDataSource
bağlayın, Şemayı Yenile'ye tıklayın, Sütunları Düzenle'ye tıklayın ve sütunu kaldırın DepartmentID
. Denetim işaretlemesi GridView
aşağıdaki örneğe benzer.
<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>
Kullanıcı açılan listede seçili bölümü değiştirdiğinde, ilişkili kurs listesinin otomatik olarak değiştirilmesini istersiniz. Bunun gerçekleşmesi için açılan listeyi seçin ve Özellikler penceresinde özelliğini olarak True
ayarlayınAutoPostBack
.
Tasarımcıyı kullanmayı tamamladığınıza göre , Kaynak görünümüne geçin ve denetimin ConnectionString
ve DefaultContainer
ad özelliklerini CoursesEntityDataSource
özniteliğiyle ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
değiştirin. İşiniz bittiğinde, denetimin işaretlemesi aşağıdaki örneğe benzer olacaktır.
<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>
Sayfayı çalıştırın ve açılan listeyi kullanarak farklı departmanlar seçin. Denetimde yalnızca seçili bölüm tarafından sunulan kurslar görüntülenir GridView
.
Verileri Gruplandırmak için EntityDataSource "GroupBy" Özelliğini Kullanma
Contoso Üniversitesi'nin Hakkında sayfasına bazı öğrenci-vücut istatistikleri eklemek istediğini varsayalım. Özellikle, kayıtlı oldukları tarihe göre öğrenci sayılarının dökümünü göstermek istiyor.
About.aspx dosyasını açın ve Kaynak görünümünde denetimin mevcut içeriğini BodyContent
etiketler arasında h2
"Öğrenci Gövdesi İstatistikleri" ile değiştirin:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Başlığın arkasına bir EntityDataSource
denetim ekleyin ve adını verin StudentStatisticsEntityDataSource
. öğesine SchoolEntities
bağlayın, varlık kümesini seçin People
ve sihirbazdaki Seç kutusunu değiştirmeden bırakın.
Özellikler penceresinde aşağıdaki özellikleri ayarlayın:
- Yalnızca öğrencilere filtre uygulamak için özelliğini olarak
it.EnrollmentDate is not null
ayarlayınWhere
. - Sonuçları kayıt tarihine göre gruplandırmak için özelliğini olarak
it.EnrollmentDate
ayarlayınGroupBy
. - Kayıt tarihini ve öğrenci sayısını seçmek için özelliğini olarak
it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents
ayarlayınSelect
. - Sonuçları kayıt tarihine göre sıralamak için özelliğini olarak
it.EnrollmentDate
ayarlayınOrderBy
.
Kaynak görünümünde ve DefaultContainer
ad özelliklerini bir ContextTypeName
özellik ile değiştirinConnectionString
. Denetim EntityDataSource
işaretlemesi artık aşağıdaki örneğe benzer.
<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>
, ve GroupBy
Where
özelliklerinin söz dizimiSelect
, geçerli varlığı belirten anahtar sözcük dışında it
Transact-SQL'e benzer.
Verileri görüntülemek üzere bir GridView
denetim oluşturmak için aşağıdaki işaretlemeyi ekleyin.
<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>
Kayıt tarihine göre öğrenci sayısını gösteren bir liste görmek için sayfayı çalıştırın.
Filtreleme ve Sıralama için QueryExtender Denetimini Kullanma
Denetim, QueryExtender
işaretlemede filtreleme ve sıralamayı belirtmek için bir yol sağlar. Söz dizimi, kullandığınız veritabanı yönetim sisteminden (DBMS) bağımsızdır. Ayrıca, gezinti özellikleri için kullandığınız söz diziminin Entity Framework'e özgü olması dışında genellikle Entity Framework'ün bağımsızdır.
Öğreticinin bu bölümünde verileri filtrelemek ve sıralamak için bir QueryExtender
denetim kullanacaksınız ve sıralama ölçütü alanlarından biri gezinti özelliği olacaktır.
(Denetim tarafından EntityDataSource
otomatik olarak oluşturulan sorguları genişletmek için işaretleme yerine kod kullanmayı tercih ederseniz, olayı işleyerek QueryCreated
bunu yapabilirsiniz. Denetim, denetim sorgularını da bu şekilde QueryExtender
genişletir EntityDataSource
.)
Courses.aspx sayfasını açın ve daha önce eklediğiniz işaretlemenin altına bir başlık, arama dizeleri girmek için bir metin kutusu, bir arama düğmesi ve varlık kümesine bağlı bir EntityDataSource
denetim oluşturmak için aşağıdaki işaretlemeyi Courses
ekleyin.
<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>
Denetimin Include
özelliğinin EntityDataSource
olarak ayarlandığına Department
dikkat edin. Veritabanında, Course
tablo departman adını içermez; yabancı bir DepartmentID
anahtar sütunu içerir. Veritabanını doğrudan sorgularsanız, kurs verileriyle birlikte bölüm adını almak için ve Department
tablolarını Course
birleştirmeniz gerekir. özelliğini olarak Department
ayarlayarak Include
Entity Framework'ün bir Course
varlık aldığında ilgili Department
varlığı alma işini yapması gerektiğini belirtirsiniz. Varlık Department
daha sonra varlığın Department
gezinti özelliğinde Course
depolanır. (Varsayılan olarak, SchoolEntities
veri modeli tasarımcısı tarafından oluşturulan sınıf gerektiğinde ilgili verileri alır ve veri kaynağı denetimini bu sınıfa bağladınız, bu nedenle özelliği ayarlamak Include
gerekli değildir. Ancak, aksi takdirde Entity Framework varlıklara ve ilgili Department
varlıklara yönelik verileri almak için veritabanına ayrı çağrılar yapacağındanCourse
, bu ayarın ayarlanması sayfanın performansını artırır.)
Yeni oluşturduğunuz denetimden EntityDataSource
sonra, bu denetime bağlı bir QueryExtender
denetim oluşturmak için aşağıdaki işaretlemeyi EntityDataSource
ekleyin.
<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>
öğesi, SearchExpression
başlıkları metin kutusuna girilen değerle eşleşen kursları seçmek istediğinizi belirtir. özelliği belirttiğindenStartsWith
, SearchType
metin kutusuna girilen karakter sayısı kadar karakter karşılaştırılır.
öğesi, OrderByExpression
sonuç kümesinin bölüm adı içindeki kurs başlığına göre sıralandığını belirtir. Departman adının nasıl belirtildiğine dikkat edin: Department.Name
. Varlık ile varlık arasındaki Course
ilişki bire bir olduğundan, Department
gezinti özelliği bir Department
varlık Department
içerir. (Bu bire çok ilişkisi olsaydı, özelliği bir koleksiyon içerirdi.) Departman adını almak için varlığın Name
özelliğini Department
belirtmeniz gerekir.
Son olarak, kurs listesini görüntülemek için bir GridView
denetim ekleyin:
<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>
İlk sütun, departman adını görüntüleyen bir şablon alanıdır. Veri bağlama ifadesi, denetimde QueryExtender
gördüğünüz gibi öğesini belirtirDepartment.Name
.
Sayfayı çalıştırın. İlk ekranda, bölüme ve ardından kurs başlığına göre sıralı olarak tüm derslerin listesi gösterilir.
Bir "m" girin ve başlıkları "m" ile başlayan tüm kursları görmek için Ara'ya tıklayın (arama büyük/küçük harfe duyarlı değildir).
Verileri Filtrelemek için "Like" İşlecini Kullanma
Denetimin özelliğinde bir işleç kullanarak denetimin QueryExtender
StartsWith
, Contains
ve EndsWith
arama türlerine EntityDataSource
Where
benzer bir Like
etki elde edebilirsiniz. Öğreticinin bu bölümünde, bir öğrenciyi ada göre aramak için işlecini Like
nasıl kullanacağınızı göreceksiniz.
Kaynak görünümünde Students.aspx dosyasını açın. Denetimden GridView
sonra aşağıdaki işaretlemeyi ekleyin:
<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>
Bu işaretleme, özellik değeri dışında Where
daha önce gördüklerinize benzer. İfadenin Where
ikinci bölümü, metin kutusuna girilen her şeyi hem ad hem de soyadlarında arayan bir alt dize araması (LIKE %FirstMidName% or LIKE %LastName%
) tanımlar.
Sayfayı çalıştırın. Parametrenin varsayılan değeri StudentName
"%" olduğundan başlangıçta tüm öğrencileri görürsünüz.
Metin kutusuna "g" harfini girin ve Ara'ya tıklayın. Ad veya soyadında "g" olan öğrencilerin listesini görürsünüz.
Artık tek tek tablolardaki verileri görüntülediniz, güncelleştirdiniz, filtrelediniz, sıraladınız ve gruplandırdık. Sonraki öğreticide ilgili verilerle (ana ayrıntı senaryoları) çalışmaya başlayacaksınız.