Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Von Tom Dykstra
Die Contoso University-Beispielwebanwendung veranschaulicht, wie ASP.NET Web Forms-Anwendungen mithilfe von Entity Framework 4.0 und Visual Studio 2010 erstellt werden. Informationen zur Lernprogrammreihe finden Sie im ersten Lernprogramm in der Reihe
Filtern, Sortieren und Gruppieren von Daten
Im vorherigen Lernprogramm haben Sie das EntityDataSource Steuerelement zum Anzeigen und Bearbeiten von Daten verwendet. In diesem Lernprogramm filtern, sortieren und gruppieren Sie Daten. Wenn Sie dies tun, indem Sie Eigenschaften des EntityDataSource Steuerelements festlegen, unterscheidet sich die Syntax von anderen Datenquellensteuerelementen. Wie Sie sehen, können Sie das Steuerelement jedoch verwenden QueryExtender , um diese Unterschiede zu minimieren.
Sie ändern die Students.aspx Seite, um nach Kursteilnehmern zu filtern, nach Namen zu sortieren und nach Namen zu suchen. Sie ändern auch die Courses.aspx Seite, um Kurse für die ausgewählte Abteilung anzuzeigen und nach Kursen nach Namen zu suchen. Schließlich fügen Sie der About.aspx Seite Schülerstatistiken hinzu.
Verwenden der EntityDataSource -Eigenschaft "Where" zum Filtern von Daten
Öffnen Sie die Students.aspx Seite, die Sie im vorherigen Lernprogramm erstellt haben. Wie derzeit konfiguriert, zeigt das GridView Steuerelement auf der Seite alle Namen aus dem People Entitätssatz an. Sie möchten jedoch nur Kursteilnehmer anzeigen, die Sie finden können, indem Sie Entitäten auswählen Person , die keine Null-Registrierungsdaten enthalten.
Wechseln Sie zur Entwurfsansicht , und wählen Sie das EntityDataSource Steuerelement aus. Legen Sie im Fenster Eigenschaften die eigenschaft Where auf it.EnrollmentDate is not nullfest.
Die Syntax, die Sie in der Where Eigenschaft des EntityDataSource Steuerelements verwenden, ist Entity SQL. Entity SQL ähnelt Transact-SQL, ist aber für die Verwendung mit Entitäten und nicht für Datenbankobjekte angepasst. Im Ausdruck it.EnrollmentDate is not nullstellt das Wort it einen Verweis auf die von der Abfrage zurückgegebene Entität dar. Daher bezieht sich it.EnrollmentDate auf die Eigenschaft EnrollmentDate der Entität Person, die das Steuerelement EntityDataSource zurückgibt.
Laden Sie die Seite. Die Kursteilnehmerliste enthält jetzt nur Schüler.The students list now contains only students. (Es werden keine Zeilen angezeigt, in denen kein Registrierungsdatum vorhanden ist.)
Verwenden der EntityDataSource -Eigenschaft "OrderBy" zum Sortieren von Daten
Sie möchten auch, dass sich diese Liste in der Namensreihenfolge befinden soll, wenn sie zum ersten Mal angezeigt wird. Wenn die seite Students.aspx weiterhin in der Entwurfsansicht geöffnet ist und das EntityDataSource Steuerelement weiterhin ausgewählt ist, legen Sie im Eigenschaftenfenster die OrderBy-Eigenschaft auf it.LastName.
Laden Sie die Seite. Die Kursteilnehmerliste ist jetzt nach dem Nachnamen sortiert.
Verwenden eines Steuerungsparameters zum Setzen der "Where"-Eigenschaft
Wie bei anderen Datenquellensteuerelementen können Sie Parameterwerte an die Where Eigenschaft übergeben. Auf der seite Courses.aspx , die Sie in Teil 2 des Lernprogramms erstellt haben, können Sie mit dieser Methode Kurse anzeigen, die der Abteilung zugeordnet sind, die ein Benutzer aus der Dropdownliste auswählt.
Öffnen Sie Courses.aspx , und wechseln Sie zur Entwurfsansicht . Fügen Sie der Seite ein zweites EntityDataSource Steuerelement hinzu, und nennen Sie es CoursesEntityDataSource. Verbinden Sie es mit dem SchoolEntities Modell, und wählen Sie Courses als EntitySetName-Wert aus.
Klicken Sie im Eigenschaftenfenster auf die Ellipsis im Wo-Feld. (Stellen Sie sicher, dass das CoursesEntityDataSource Steuerelement noch ausgewählt ist, bevor Sie das Eigenschaftenfenster verwenden.)
Das Dialogfeld " Ausdrucks-Editor " wird angezeigt. Wählen Sie in diesem Dialogfeld den Ausdruck "Wo" basierend auf den bereitgestellten Parametern automatisch generieren, und klicken Sie dann auf "Parameter hinzufügen". Benennen Sie den Parameter DepartmentID, wählen Sie Steuerung als Parameterquelle aus, und wählen Sie DepartmentsDropDownList als ControlID-Wert.
Klicken Sie auf "Erweiterte Eigenschaften anzeigen", und ändern Sie im Dialogfeld " Eigenschaften " des Ausdrucks-Editors die Type Eigenschaft in Int32.
Wenn Sie fertig sind, klicken Sie auf "OK".
Fügen Sie unterhalb der Dropdownliste der Seite ein GridView Steuerelement hinzu, und nennen Sie es CoursesGridView. Verbinden Sie sie mit dem CoursesEntityDataSource Datenquellensteuerelement, klicken Sie auf "Schema aktualisieren", klicken Sie auf "Spalten bearbeiten", und entfernen Sie die DepartmentID Spalte. Das GridView Steuerelementmarkup ähnelt dem folgenden Beispiel.
<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>
Wenn der Benutzer die ausgewählte Abteilung in der Dropdownliste ändert, soll die Liste der zugehörigen Kurse automatisch geändert werden. Um dies zu ermöglichen, wählen Sie die Dropdownliste aus, und legen Sie im Eigenschaftenfenster die AutoPostBack Eigenschaft auf True.
Nachdem Sie mit der Verwendung des Designers fertig sind, wechseln Sie zur Quellansicht , und ersetzen Sie die ConnectionStringDefaultContainer Eigenschaften des CoursesEntityDataSource Steuerelements durch das ContextTypeName="ContosoUniversity.DAL.SchoolEntities" Attribut. Wenn Sie fertig sind, sieht das Markup für das Steuerelement wie im folgenden Beispiel aus.
<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>
Führen Sie die Seite aus, und verwenden Sie die Dropdownliste, um verschiedene Abteilungen auszuwählen. Nur Kurse, die von der ausgewählten Abteilung angeboten werden, werden im GridView Steuerelement angezeigt.
Verwenden der EntityDataSource -Eigenschaft "GroupBy" zum Gruppieren von Daten
Angenommen, die Contoso University möchte einige Statistiken zur Schülerschaft auf der Seite "Info" ablegen. Insbesondere möchte sie eine Aufschlüsselung der Anzahl der Schüler nach dem Datum anzeigen, an dem sie sich registriert haben.
Öffnen Sie About.aspx, und ersetzen Sie in der Quellansicht den vorhandenen Inhalt des BodyContent Steuerelements durch "Student Body Statistics" zwischen h2 Tags:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Fügen Sie nach der Überschrift ein EntityDataSource Steuerelement hinzu, und nennen Sie es StudentStatisticsEntityDataSource. Verbinden Sie es mit SchoolEntities, wählen Sie das People Entitäten-Set aus, und lassen Sie das Auswahlfeld im Assistenten unverändert. Legen Sie die folgenden Eigenschaften im Eigenschaftenfenster fest:
- Um nur nach Kursteilnehmern zu filtern, legen Sie die
WhereEigenschaft aufit.EnrollmentDate is not null. - Um die Ergebnisse nach dem Registrierungsdatum zu gruppieren, legen Sie die
GroupByEigenschaft aufit.EnrollmentDate. - Um das Registrierungsdatum und die Anzahl der Kursteilnehmer auszuwählen, legen Sie die
SelectEigenschaft aufit.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents. - Um die Ergebnisse nach dem Registrierungsdatum zu sortieren, legen Sie die
OrderByEigenschaft aufit.EnrollmentDate.
Ersetzen Sie in der Quellansicht die ConnectionString und DefaultContainer Nameigenschaften durch eine ContextTypeName Eigenschaft. Das Kontrollmarkup EntityDataSource ähnelt nun dem folgenden Beispiel.
<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>
Die Syntax der Select, GroupByund Where Eigenschaften ähnelt Transact-SQL mit Ausnahme des it Schlüsselworts, das die aktuelle Entität angibt.
Fügen Sie das folgende Markup hinzu, um ein GridView Steuerelement zum Anzeigen der Daten zu erstellen.
<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>
Führen Sie die Seite aus, um eine Liste anzuzeigen, in der die Anzahl der Kursteilnehmer nach Anmeldedatum angezeigt wird.
Verwenden des QueryExtender-Steuerelements zum Filtern und Sortieren
Das QueryExtender Steuerelement bietet eine Möglichkeit zum Angeben von Filtern und Sortieren im Markup. Die Syntax ist unabhängig von dem datenbankverwaltungssystem (DBMS), das Sie verwenden. Es ist auch allgemein unabhängig vom Entity Framework, mit der Ausnahme, dass die Syntax, die Sie für Navigationseigenschaften verwenden, für das Entity Framework eindeutig ist.
In diesem Teil des Lernprogramms verwenden Sie ein QueryExtender Steuerelement zum Filtern und Sortieren von Daten, und eines der Felder nach Reihenfolge ist eine Navigationseigenschaft.
(Wenn Sie lieber Code anstelle von Markup verwenden möchten, um die vom Steuerelement automatisch generierten EntityDataSource Abfragen zu erweitern, können Sie dies tun, indem Sie das QueryCreated Ereignis behandeln. So erweitert QueryExtender das EntityDataSource Steuerelement auch Steuerelementabfragen.)
Öffnen Sie die Courses.aspx Seite, und fügen Sie unter dem zuvor hinzugefügten Markup das folgende Markup ein, um eine Überschrift zu erstellen, ein Textfeld zum Eingeben von Suchzeichenfolgen, eine Suchschaltfläche und ein EntityDataSource Steuerelement, das an den Courses Entitätssatz gebunden ist.
<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>
Beachten Sie, dass die Eigenschaft Include des Steuerelements EntityDataSource auf Department gesetzt ist. In der Datenbank enthält die Course Tabelle nicht den Abteilungsnamen; sie enthält eine DepartmentID Fremdschlüsselspalte. Wenn Sie die Datenbank direkt abfragen würden, müssten Sie zum Abrufen des Abteilungsnamens zusammen mit den Kursdaten die Tabellen Course und Department verknüpfen. Indem Sie die Include-Eigenschaft auf Department festlegen, geben Sie vor, dass das Entity Framework die zugehörige Department-Entität abrufen soll, wenn es eine Course-Entität abruft. Die Department Entität wird dann in der Department Navigationseigenschaft der Course Entität gespeichert. (Standardmäßig ruft die SchoolEntities Klasse, die vom Datenmodell-Designer generiert wurde, verwandte Daten ab, wenn sie benötigt wird, und Sie haben das Datenquellensteuerelement an diese Klasse gebunden, sodass das Festlegen der Include Eigenschaft nicht erforderlich ist. Die Einstellung verbessert jedoch die Leistung der Seite, da andernfalls das Entity Framework separate Aufrufe an die Datenbank zum Abrufen von Daten für die Course Entitäten und für die zugehörigen Department Entitäten vornimmt.)
Fügen Sie nach dem EntityDataSource soeben erstellten Steuerelement das folgende Markup ein, um ein QueryExtender Steuerelement zu erstellen, das an dieses EntityDataSource Steuerelement gebunden ist.
<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>
Das SearchExpression Element gibt an, dass Sie Kurse auswählen möchten, deren Titel dem im Textfeld eingegebenen Wert entsprechen. Es werden nur so viele Zeichen verglichen, wie in das Textfeld eingegeben werden, da die SearchType-Eigenschaft StartsWith angibt.
Das OrderByExpression Element gibt an, dass das Resultset nach Kurstitel innerhalb des Abteilungsnamens sortiert wird. Beachten Sie, wie der Abteilungsname angegeben wird: Department.Name. Da die Zuordnung zwischen der Course Entität und der Department Entität 1:1 ist, enthält die Department Navigationseigenschaft eine Department Entität. (Wenn dies eine 1:n-Beziehung wäre, würde die Eigenschaft eine Sammlung enthalten.) Um den Namen der Abteilung abzurufen, müssen Sie die Name-Eigenschaft der Department-Entität angeben.
Fügen Sie schließlich ein GridView Steuerelement hinzu, um die Liste der Kurse anzuzeigen:
<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>
Die erste Spalte ist ein Vorlagenfeld, das den Abteilungsnamen anzeigt. Der Datenbindungsausdruck gibt Department.Name an, genau wie Sie es im QueryExtender-Steuerelement gesehen haben.
Laden Sie die Seite. Die erste Anzeige zeigt eine Liste aller Kurse nach Abteilung und dann nach Kurstitel an.
Geben Sie ein "m" ein, und klicken Sie auf "Suchen ", um alle Kurse anzuzeigen, deren Titel mit "m" beginnen (bei der Suche wird die Groß-/Kleinschreibung nicht beachtet).
Verwenden des Operators "Gefällt mir" zum Filtern von Daten
Sie können einen Effekt erzielen, der dem QueryExtender, StartsWith- und Contains-Steuerelement sowie den EndsWith-Suchtypen ähnelt, indem Sie im Where-Feld des EntityDataSource-Steuerelements mit einem Like-Operator arbeiten. In diesem Teil des Lernprogramms erfahren Sie, wie Sie den Like Operator verwenden, um nach einem Kursteilnehmer anhand des Namens zu suchen.
Öffnen Sie Students.aspx in der Quellansicht . Fügen Sie nach dem GridView Steuerelement das folgende Markup hinzu:
<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>
Dieses Markup ähnelt dem, was Sie zuvor gesehen haben, mit Ausnahme des Where Eigenschaftswerts. Der zweite Teil des Where Ausdrucks definiert eine Teilzeichenfolgensuche (LIKE %FirstMidName% or LIKE %LastName%), die sowohl die Vor- als auch die Nachnamen nach dem durchsucht, was in das Textfeld eingegeben wird.
Laden Sie die Seite. Zunächst werden alle Kursteilnehmer angezeigt, da der Standardwert für den StudentName Parameter "%" lautet.
Geben Sie den Buchstaben "g" in das Textfeld ein, und klicken Sie auf "Suchen". Es wird eine Liste der Kursteilnehmer mit einem "g" im Vor- oder Nachnamen angezeigt.
Sie haben jetzt Daten aus einzelnen Tabellen angezeigt, aktualisiert, gefiltert, sortiert und gruppiert. Im nächsten Lernprogramm beginnen Sie mit der Arbeit mit verwandten Daten (Master-Detail-Szenarien).