Aracılığıyla paylaş


Entity Framework 4.0 Database First ve ASP.NET 4 Web Forms ile Çalışmaya Başlama - Bölüm 3

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.

Öğrenci tablosu içeren Öğrenci Listesi görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

Bölüme Göre Kurslar ve Ada Göre Kurslar görünümlerini gösteren Internet Explorer penceresinin ekran görüntüsü.

Kayıt tarihleri tablosuyla Birlikte Öğrenci Gövdesi İstatistikleri görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

Arama sorgusuna g harfinin girildiği Ada Göre Öğrencileri Bul görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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 nullayarlayınWhere.

Resim01

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.)

Öğrenci tablosu içeren Öğrenci Listesi görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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.LastNameayarlayın.

Görüntü05

Sayfayı çalıştırın. Öğrenci listesi artık soyadına göre sıralanır.

Görüntü04

"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.)

Görüntü06

İ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 DepartmentIDadlandırın, Parametre kaynak değeri olarak Control'i seçin ve ControlID değeri olarak DepartmentsDropDownList öğesini seçin.

Görüntü07

Gelişmiş özellikleri göster'e tıklayın ve İfade Düzenleyicisi iletişim kutusunun Özellikler penceresinde özelliğini olarak Int32değiştirinType.

Resim15

İş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 TrueayarlayınAutoPostBack.

Görüntü08

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 .

Görüntü09

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 SchoolEntitiesbağ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 nullayarlayınWhere.
  • Sonuçları kayıt tarihine göre gruplandırmak için özelliğini olarak it.EnrollmentDateayarlayınGroupBy.
  • Kayıt tarihini ve öğrenci sayısını seçmek için özelliğini olarak it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudentsayarlayınSelect.
  • Sonuçları kayıt tarihine göre sıralamak için özelliğini olarak it.EnrollmentDateayarlayı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 GroupByWhere ö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.

Kayıt tarihleri tablosu içeren Öğrenci Gövdesi İstatistikleri görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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 Departmentdikkat 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 Departmentayarlayarak 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.

Bölüme Göre Kurslar ve Ada Göre Kurslar görünümlerini gösteren Internet Explorer penceresinin ekran görüntüsü.

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).

Resim12

Verileri Filtrelemek için "Like" İşlecini Kullanma

Denetimin özelliğinde bir işleç kullanarak denetimin QueryExtenderStartsWith, Containsve EndsWith arama türlerine EntityDataSourceWhere 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.

Resim13

Metin kutusuna "g" harfini girin ve Ara'ya tıklayın. Ad veya soyadında "g" olan öğrencilerin listesini görürsünüz.

Arama sorgusuna g harfinin girildiği Ada Göre Öğrencileri Bul görünümünü gösteren Internet Explorer penceresinin ekran görüntüsü.

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.