Entity Framework 4,0 Database First ve ASP.NET 4 Web Forms-Bölüm 3 ' ü kullanmaya başlama

Tom Dykstra tarafından

Contoso Üniversitesi örnek Web uygulaması, 4,0 ve Visual Studio 2010 Entity Framework kullanarak nasıl ASP.NET Web Forms uygulamalar oluşturacağınızı gösterir. Öğretici serisi hakkında daha fazla bilgi için, serideki ilk öğreticiye bakın

Verileri filtreleme, sıralama ve gruplama

Önceki öğreticide, verileri göstermek ve düzenlemek için EntityDataSource denetimini kullandınız. Bu öğreticide, verileri filtreleyecek, sıralarız ve gruplarız. EntityDataSource denetiminin özelliklerini ayarlayarak bunu yaptığınızda söz dizimi diğer veri kaynağı denetimlerinden farklıdır. Ancak gördüğünüz gibi, bu farklılıkları en aza indirmek için QueryExtender denetimini kullanabilirsiniz.

Öğrenciler için filtre uygulamak, ada göre sıralamak ve ad aramak için öğrenciler. aspx sayfasını değiştireceksiniz. Ayrıca, Kurslar. aspx sayfasını, seçilen departmanın kurslarını görüntüleyecek ve kurs adına göre arayacak şekilde değiştireceksiniz. Son olarak, About. aspx sayfasına öğrenci istatistiklerini ekleyeceksiniz.

Image02

Image11

Image10

Image14

Verileri filtrelemek için EntityDataSource "Where" özelliğini kullanma

Önceki öğreticide oluşturduğunuz öğrenciler. aspx sayfasını açın. Şu anda yapılandırıldığı gibi, sayfadaki GridView denetim People varlık kümesindeki tüm adları görüntüler. Ancak, yalnızca, null olmayan kayıt tarihleri olan Person varlıkları seçerek bulabileceğiniz öğrencileri göstermek istersiniz.

Tasarım görünümüne geçin ve EntityDataSource denetimi seçin. Özellikler penceresinde Where özelliğini it.EnrollmentDate is not nullolarak ayarlayın.

Image01

EntityDataSource denetiminin Where özelliğinde kullandığınız sözdizimi Entity SQL. Entity SQL Transact-SQL ' e benzer, ancak veritabanı nesneleri yerine varlıklarla birlikte kullanılmak üzere özelleştirilir. İfade it.EnrollmentDate is not null, it sözcük, sorgu tarafından döndürülen varlığa bir başvuruyu temsil eder. Bu nedenle it.EnrollmentDate, EntityDataSource denetiminin döndürdüğü Person varlığının EnrollmentDate özelliğine başvurur.

Sayfayı çalıştırın. Öğrenciler listesi artık yalnızca öğrenciler içeriyor. (Kayıt tarihi olmayan bir satır görüntülenir.)

Image02

Verileri sıralamak için EntityDataSource "OrderBy" özelliğini kullanma

Bu listenin, ilk görüntülenmesiyle aynı sırada olmasını istersiniz. Öğrenciler. aspx sayfası Tasarım görünümünde hala açıkken ve EntityDataSource denetimi hala seçili durumdayken, Özellikler penceresinde OrderBy özelliğini it.LastNameolarak ayarlayın.

Image05

Sayfayı çalıştırın. Öğrenciler listesi artık son ada göre sırada.

Image04

"Where" özelliğini ayarlamak için bir denetim parametresi kullanma

Diğer veri kaynağı denetimlerinde olduğu gibi, Where özelliğine parametre değerleri geçirebilirsiniz. Öğreticinin 2. bölümünde oluşturduğunuz Kurslar. aspx sayfasında, bir kullanıcının açılan listeden seçtiği departmanla ilişkili kursları göstermek için bu yöntemi kullanabilirsiniz.

Kurslar. aspx ' i açın ve Tasarım görünümüne geçin. Sayfaya ikinci bir EntityDataSource denetimi ekleyin ve CoursesEntityDataSourceolarak adlandırın. SchoolEntities modeline bağlayın ve entitySetName değeri olarak Courses ' ı seçin.

Özellikler penceresinde, WHERE özellik kutusunda üç nokta simgesine tıklayın. ( Özellikler penceresini kullanmadan önce CoursesEntityDataSource denetiminin hala seçili olduğundan emin olun.)

Image06

Ifade Düzenleyicisi iletişim kutusu görüntülenir. Bu iletişim kutusunda, belirtilen parametrelere göre WHERE Ifadesini otomatik olarak oluştur' u seçin ve ardından parametre Ekle' ye tıklayın. DepartmentIDparametreyi adlandırın, parametre kaynak değeri olarak Denetim ' i seçin ve ControlID değeri olarak DepartmentsDropDownList ' ı seçin.

Image07

Gelişmiş özellikleri göster' e tıklayın ve ifade Düzenleyicisi iletişim kutusunun Özellikler penceresinde Type özelliğini Int32olarak değiştirin.

Image15

İşiniz bittiğinde, Tamam’a tıklayın.

Aşağı açılan listenin altında, sayfaya bir GridView denetimi ekleyin ve CoursesGridViewadlandırın. CoursesEntityDataSource veri kaynağı denetimine bağlayın, şemayı Yenile' ye tıklayın, Sütunları Düzenle' ye tıklayın ve DepartmentID sütununu kaldırın. GridView denetim biçimlendirmesi 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şağı açılan listede seçilen departmanı değiştirdiğinde, ilişkili kurslar listesinin otomatik olarak değiştirilmesini istiyorsunuz. Bunun gerçekleşmesini sağlamak için açılır listeyi seçin ve Özellikler penceresinde AutoPostBack özelliğini Trueolarak ayarlayın.

Image08

Tasarımcı 'yı kullanmayı tamamladığınıza göre, kaynak görünümüne geçin ve CoursesEntityDataSource denetiminin ConnectionString ve DefaultContainer adı özelliklerini ContextTypeName="ContosoUniversity.DAL.SchoolEntities" özniteliğiyle değiştirin. İşiniz bittiğinde, denetim biçimlendirmesi aşağıdaki örneğe benzer şekilde görünü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 farklı departmanlar seçmek için açılan listeyi kullanın. Yalnızca seçilen departman tarafından sunulan kurslar GridView denetiminde görüntülenir.

Image09

Verileri gruplamak için EntityDataSource "GroupBy" özelliğini kullanma

Contoso University 'in, hakkında daha fazla öğrenci-gövde istatistiklerini almak istediğini varsayalım. Özellikle, kaydolduğu tarihe göre öğrencilerin numaralarının dökümünü göstermek istemektedir.

. Aspx' i açın ve kaynak görünümü ' nde, BodyContent denetiminin varolan içeriğini h2 Etiketler arasında "öğrenci gövdesi istatistikleri" ile değiştirin:

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

Başlıktan sonra, EntityDataSource bir denetim ekleyin ve StudentStatisticsEntityDataSourceadlandırın. SchoolEntitiesbağlayın, People varlık kümesini seçin ve sihirbazdaki Seç kutusunu değiştirmeden bırakın. Özellikler penceresinde aşağıdaki özellikleri ayarlayın:

  • Yalnızca öğrencilerle filtrelemek için Where özelliğini it.EnrollmentDate is not nullolarak ayarlayın.
  • Sonuçları kayıt tarihine göre gruplandırmak için GroupBy özelliğini it.EnrollmentDateolarak ayarlayın.
  • Kayıt tarihini ve öğrenci sayısını seçmek için Select özelliğini it.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudentsolarak ayarlayın.
  • Sonuçları kayıt tarihine göre sıralamak için OrderBy özelliğini it.EnrollmentDateolarak ayarlayın.

Kaynak görünümü ' nde, ConnectionString ve DefaultContainer adı özelliklerini bir ContextTypeName özelliği ile değiştirin. EntityDataSource denetim biçimlendirmesi 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>

Select, GroupByve Where özelliklerinin sözdizimi, geçerli varlığı belirten it anahtar sözcüğü dışında Transact-SQL ' i benzerdir.

Verileri göstermek için bir GridView denetimi oluşturmak üzere aşağıdaki biçimlendirmeyi 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.

Image10

Filtreleme ve sıralama için Querygenişletici denetimini kullanma

QueryExtender denetim, İşaretlemede filtreleme ve sıralamayı belirtmenin bir yolunu sağlar. Sözdizimi, kullanmakta olduğunuz veritabanı yönetim sistemi 'nden (DBMS) bağımsızdır. Ayrıca, gezinti özellikleri için kullandığınız söz dizimi Entity Framework benzersiz olan özel durum ile, genellikle Entity Framework bağımsızdır.

Öğreticinin bu bölümünde, verileri filtrelemek ve sıralamak için bir QueryExtender denetimi kullanacaksınız ve order by alanlarından biri bir gezinti özelliği olacaktır.

(EntityDataSource denetimi tarafından otomatik olarak oluşturulan sorguları genişletmek için biçimlendirme yerine kodu kullanmayı tercih ediyorsanız, bunu QueryCreated olayını işleyerek yapabilirsiniz. QueryExtender denetimi, EntityDataSource denetim sorgularını de genişletmektedir.)

Kurslar. aspx sayfasını açın ve daha önce eklediğiniz biçimlendirmenin altında, bir başlık oluşturmak için aşağıdaki biçimlendirmeyi, arama dizeleri girmeye yönelik bir metin kutusunu, bir arama düğmesini ve Courses varlık kümesine bağlanan EntityDataSource denetimini 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>

EntityDataSource denetiminin Include özelliğinin Departmentolarak ayarlandığını unutmayın. Veritabanında, Course tablosu departman adını içermez; DepartmentID yabancı anahtar sütunu içerir. Veritabanını doğrudan sorguladığınız takdirde, Bölüm adını kurs verileriyle birlikte almak için Course ve Department tablolarına katılmanız gerekir. Include özelliğini Departmentolarak ayarlayarak, Entity Framework bir Course varlığı aldığında ilgili Department varlığı alma işini yapması gerektiğini belirtirsiniz. Department varlık daha sonra Course varlığının Department gezinti özelliğinde depolanır. (Varsayılan olarak, veri modeli Tasarımcısı tarafından oluşturulan SchoolEntities sınıfı, gerektiğinde ilgili verileri alır ve veri kaynağı denetimini bu sınıfa bağlamışsanız, Include özelliğinin ayarlanması gerekli değildir. Ancak, Entity Framework, bu sayfanın performansını artırır, aksi takdirde Course varlıklar ve ilgili Department varlıkları için verileri almak üzere veritabanına ayrı çağrılar yapacağından.)

Yeni oluşturduğunuz EntityDataSource denetiminden sonra, bu EntityDataSource denetimine bağlanan QueryExtender bir denetim oluşturmak için aşağıdaki biçimlendirmeyi 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>

SearchExpression öğesi, başlıkları metin kutusuna girilen değerle eşleşen kurslar seçmek istediğinizi belirtir. SearchType özelliği StartsWithbelirttiğinden, yalnızca metin kutusuna girilen sayıda karakter karşılaştırılacaktır.

OrderByExpression öğesi, sonuç kümesinin, Bölüm adı içindeki kurs başlığına göre sipariş olacağını belirtir. Bölüm adının nasıl belirtildiğine dikkat edin: Department.Name. Course varlık ve Department varlık arasındaki ilişki bire bir, Department gezinti özelliği bir Department varlığı içerir. (Bu bir-çok ilişkisi ise, özelliği bir koleksiyon içerir.) Bölüm adını almak için Department varlığının Name özelliğini belirtmeniz gerekir.

Son olarak, kurslar listesini göstermek için bir GridView denetimi 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, Bölüm adını görüntüleyen bir şablon alanıdır. Veri bağlama ifadesi, tıpkı QueryExtender denetiminde gördüğünüz gibi Department.Namebelirtir.

Sayfayı çalıştırın. İlk ekran, bölüm ve ardından kurs başlığına göre sırasıyla tüm kursların bir listesini gösterir.

Image11

Başlıkları "d" ile başlayan tüm kursları görmek için "d" girin ve Ara ' ya tıklayın (arama büyük/küçük harfe duyarlı değildir).

Image12

Verileri filtrelemek için "Like" Işlecini kullanma

Like denetiminin EntityDataSource özelliğinde bir Where işleci kullanarak QueryExtender denetiminin StartsWith, Containsve EndsWith arama türlerine benzer bir efekt elde edebilirsiniz. Öğreticinin bu bölümünde, ada göre bir öğrenci aramak için Like işlecini nasıl kullanacağınızı göreceksiniz.

Kaynak görünümünde öğrenciler. aspx ' i açın. GridView denetiminden sonra aşağıdaki biçimlendirmeyi 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 biçimlendirme, Where Özellik değeri dışında daha önce gördüğünüze benzerdir. Where ifadesinin ikinci bölümü, metin kutusuna her şey için hem ilk hem de soyadlarını arayan bir alt dize aramasını (LIKE %FirstMidName% or LIKE %LastName%) tanımlar.

Sayfayı çalıştırın. Başlangıçta tüm öğrencileri görürsünüz çünkü StudentName parametresi için varsayılan değer "%".

Image13

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

Image14

Artık tek tek tablolardan, güncelleştirilmiş, filtrelenmiş, sıralanmış ve gruplandırılmış verileri görüntüdiniz. Sonraki öğreticide ilgili verilerle (ana ayrıntı senaryolarında) çalışmaya başlayabilirsiniz.