Tutorial: Hinzufügen von Sortierung, Filterung und Paging mit dem Entity Framework in einer ASP.NET MVC-Anwendung

Im vorherigen Tutorial haben Sie eine Reihe von Webseiten für grundlegende CRUD-Vorgänge für Student Entitäten implementiert. In diesem Tutorial fügen Sie der Seite Schülerindex Sortier-, Filter- und Pagingfunktionen hinzu. Sie erstellen auch eine einfache Gruppierungsseite.

Die folgende Abbildung zeigt, wie die Seite aussieht, wenn Sie fertig sind. Die Spaltenüberschriften sind Links, auf die der Benutzer klicken kann, um die Spalte zu sortieren. Wiederholtes Klicken auf eine Spaltenüberschrift schaltet zwischen aufsteigender und absteigender Sortierreihenfolge um.

Students_Index_page_with_paging

In diesem Tutorial:

  • Hinzufügen von Spaltensortierungslinks
  • Hinzufügen eines Suchfelds
  • Hinzufügen von Paging
  • Erstellen einer Infoseite

Voraussetzungen

Um die Sortierung zur Seite Student Index hinzuzufügen, ändern Sie die Index Methode des Student Controllers und fügen der Student Indexansicht Code hinzu.

Hinzufügen von Sortierfunktionen zur Index-Methode

  • Ersetzen Sie in Controllers\StudentController.cs die Index -Methode durch den folgenden Code:

    public ActionResult Index(string sortOrder)
    {
       ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
       ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
       var students = from s in db.Students
                      select s;
       switch (sortOrder)
       {
          case "name_desc":
             students = students.OrderByDescending(s => s.LastName);
             break;
          case "Date":
             students = students.OrderBy(s => s.EnrollmentDate);
             break;
          case "date_desc":
             students = students.OrderByDescending(s => s.EnrollmentDate);
             break;
          default:
             students = students.OrderBy(s => s.LastName);
             break;
       }
       return View(students.ToList());
    }
    

Dieser Code empfängt einen sortOrder-Parameter aus der Abfragezeichenfolge in der URL. Der Abfragezeichenfolgenwert wird von ASP.NET MVC als Parameter für die Aktionsmethode bereitgestellt. Der Parameter ist eine Zeichenfolge, die entweder "Name" oder "Date" ist, optional gefolgt von einem Unterstrich und der Zeichenfolge "desc", um die absteigende Reihenfolge anzugeben. Standardmäßig wird eine aufsteigende Sortierreihenfolge verwendet.

Bei der ersten Anforderung der Indexseite gibt es keine Abfragezeichenfolge. Die Kursteilnehmer werden in aufsteigender Reihenfolge von LastNameangezeigt. Dies ist der Standardwert, wie durch den Fallthrough-Fall in der switch -Anweisung festgelegt. Wenn der Benutzer auf den Link einer Spaltenüberschrift klickt, wird der entsprechende sortOrder-Wert in der Abfragezeichenfolge bereitgestellt.

Die beiden ViewBag Variablen werden verwendet, damit die Ansicht die Spaltenüberschriftenlinks mit den entsprechenden Abfragezeichenfolgenwerten konfigurieren kann:

ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";

Hierbei handelt es sich um ternäre Anweisungen. Die erste gibt an, dass, wenn der sortOrder Parameter NULL oder leer ist, ViewBag.NameSortParm auf "name_desc" festgelegt werden soll. Andernfalls sollte er auf eine leere Zeichenfolge festgelegt werden. Diese beiden Anweisungen ermöglichen der Ansicht das Festlegen der Links für Spaltenüberschriften wie folgt:

Aktuelle Sortierreihenfolge Hyperlink „Nachname“ Hyperlink „Datum“
Nachname (aufsteigend) descending ascending
Nachname (absteigend) ascending ascending
Datum (aufsteigend) ascending descending
Datum (absteigend) ascending ascending

Die -Methode verwendet LINQ to Entities, um die Spalte anzugeben, nach der sortiert werden soll. Der Code erstellt eine IQueryable<T> Variable vor der switch -Anweisung, ändert sie in der switch -Anweisung und ruft die ToList -Methode nach der -Anweisung auf switch . Es wir keine Abfrage an die Datenbank gesendet, wenn Sie die IQueryable-Variablen erstellen und ändern. Die Abfrage wird erst ausgeführt, wenn Sie das IQueryable Objekt durch Aufrufen einer Methode wie ToList. Daher führt dieser Code zu einer einzelnen Abfrage, die erst mit der return View -Anweisung ausgeführt wird.

Alternativ zum Schreiben unterschiedlicher LINQ-Anweisungen für jede Sortierreihenfolge können Sie dynamisch eine LINQ-Anweisung erstellen. Informationen zu dynamischem LINQ finden Sie unter Dynamisches LINQ.

  1. Ersetzen Sie in Views\Student\Index.cshtml die <tr> Elemente und <th> für die Überschriftenzeile durch den hervorgehobenen Code:

    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    <table class="table">
        <tr>
            <th>
                @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm })
            </th>
            <th>First Name
            </th>
            <th>
                @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm })
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
    

    Dieser Code verwendet die Informationen in den ViewBag Eigenschaften, um Hyperlinks mit den entsprechenden Abfragezeichenfolgenwerten einzurichten.

  2. Führen Sie die Seite aus, und klicken Sie auf die Spaltenüberschriften Nachname und Registrierungsdatum , um zu überprüfen, ob die Sortierung funktioniert.

    Nachdem Sie auf die Überschrift Nachname geklickt haben, werden die Kursteilnehmer in absteigender Nachnamereihenfolge angezeigt.

Zum Hinzufügen von Filterung zur Seite Schülerindex fügen Sie der Ansicht ein Textfeld und eine Schaltfläche zum Senden hinzu und nehmen entsprechende Änderungen an der Methode vor Index . Im Textfeld können Sie eine Zeichenfolge eingeben, nach der in den Feldern Vorname und Nachname gesucht werden soll.

Hinzufügen der Filterfunktion zur Indexmethode

  • Ersetzen Sie in Controller\StudentController.cs die Index -Methode durch den folgenden Code (die Änderungen sind hervorgehoben):

    public ViewResult Index(string sortOrder, string searchString)
    {
        ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
        ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
        var students = from s in db.Students
                       select s;
        if (!String.IsNullOrEmpty(searchString))
        {
            students = students.Where(s => s.LastName.Contains(searchString)
                                   || s.FirstMidName.Contains(searchString));
        }
        switch (sortOrder)
        {
            case "name_desc":
                students = students.OrderByDescending(s => s.LastName);
                break;
            case "Date":
                students = students.OrderBy(s => s.EnrollmentDate);
                break;
            case "date_desc":
                students = students.OrderByDescending(s => s.EnrollmentDate);
                break;
            default:
                students = students.OrderBy(s => s.LastName);
                break;
        }
    
        return View(students.ToList());
    }
    

Der Code fügt der Index -Methode einen Parameter hinzusearchString. Der Zeichenfolgenwert für die Suche wird aus einem Textfeld empfangen, das Sie zur Indexansicht hinzufügen. Außerdem wird der LINQ-Anweisung eine where Klausel hinzugefügt, die nur Kursteilnehmer auswählt, deren Vorname oder Nachname die Suchzeichenfolge enthält. Die -Anweisung, die die Where -Klausel hinzufügt, wird nur ausgeführt, wenn nach einem Wert gesucht werden muss.

Hinweis

In vielen Fällen können Sie dieselbe Methode entweder für einen Entity Framework-Entitätssatz oder als Erweiterungsmethode für eine In-Memory-Sammlung aufrufen. Die Ergebnisse sind normalerweise identisch, können aber in einigen Fällen unterschiedlich sein.

Beispielsweise gibt die .NET Framework Implementierung der Contains -Methode alle Zeilen zurück, wenn Sie eine leere Zeichenfolge an sie übergeben, aber der Entity Framework-Anbieter für SQL Server Compact 4.0 gibt null Zeilen für leere Zeichenfolgen zurück. Daher stellt der Code im Beispiel (die Where -Anweisung in einer Anweisung) if sicher, dass Sie für alle Versionen von SQL Server die gleichen Ergebnisse erhalten. Außerdem führt die .NET Framework Implementierung der Contains Methode standardmäßig einen Vergleich zwischen Groß- und Kleinschreibung durch, aber Entity Framework SQL Server Anbieter führen standardmäßig Vergleiche ohne Beachtung der Groß-/Kleinschreibung durch. Wenn Sie die ToUpper -Methode aufrufen, um den Test explizit ohne Groß-/Kleinschreibung zu berücksichtigen, wird daher sichergestellt, dass sich die Ergebnisse nicht ändern, wenn Sie den Code später so ändern, dass er ein Repository verwendet, das anstelle eines Objekts eine IEnumerableIQueryable Auflistung zurückgibt. (Beim Aufrufen der Contains-Methode einer IEnumerable-Sammlung erhalten Sie die .NET Framework-Implementierung. Wenn Sie sie auf einem IQueryable-Objekt aufrufen, erhalten Sie die Implementierung des Datenanbieters.)

Die NULL-Behandlung kann sich auch bei verschiedenen Datenbankanbietern oder bei Verwendung eines IQueryable Objekts im Vergleich zur Verwendung einer IEnumerable Auflistung unterscheiden. In einigen Szenarios gibt eine Where Bedingung z. B table.Column != 0 . möglicherweise keine Spalten zurück, die als Wert enthalten null . Standardmäßig generiert EF zusätzliche SQL-Operatoren, damit die Gleichheit zwischen NULL-Werten in der Datenbank funktioniert, wie sie im Arbeitsspeicher funktioniert. Sie können jedoch das UseDatabaseNullSemantics-Flag in EF6 festlegen oder die UseRelationalNulls-Methode in EF Core aufrufen, um dieses Verhalten zu konfigurieren.

Hinzufügen eines Suchfelds zur Indexansicht "Student"

  1. Fügen Sie in Views\Student\Index.cshtml den hervorgehobenen Code unmittelbar vor dem öffnenden table Tag hinzu, um eine Untertitel, ein Textfeld und eine Schaltfläche Suchen zu erstellen.

    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    
    @using (Html.BeginForm())
    {
        <p>
            Find by name: @Html.TextBox("SearchString")  
            <input type="submit" value="Search" /></p>
    }
    
    <table>
        <tr>
    
  2. Führen Sie die Seite aus, geben Sie eine Suchzeichenfolge ein, und klicken Sie auf Suchen , um zu überprüfen, ob die Filterung funktioniert.

    Beachten Sie, dass die URL nicht die Suchzeichenfolge "an" enthält. Dies bedeutet, dass Sie die gefilterte Liste nicht erhalten, wenn Sie das Lesezeichen verwenden. Dies gilt auch für die Spaltensortierlinks, da sie die gesamte Liste sortieren. Sie ändern die Schaltfläche Suchen weiter unten im Tutorial, um Abfragezeichenfolgen für Filterkriterien zu verwenden.

Hinzufügen von Paging

Um paging zur Indexseite Students hinzuzufügen, installieren Sie zunächst das NuGet-Paket PagedList.Mvc . Anschließend nehmen Sie zusätzliche Änderungen an der Index -Methode vor und fügen der Ansicht Paginglinks Index hinzu. PagedList.Mvc ist eines von vielen guten Paging- und Sortierpaketen für ASP.NET MVC, und seine Verwendung hier ist nur als Beispiel gedacht, nicht als Empfehlung dafür gegenüber anderen Optionen.

Installieren des NuGet-Pakets PagedList.MVC

Das NuGet PagedList.Mvc-Paket installiert das PagedList-Paket automatisch als Abhängigkeit. Das PagedList-Paket installiert einen PagedList Sammlungstyp und Erweiterungsmethoden für IQueryable und IEnumerable Sammlungen. Die Erweiterungsmethoden erstellen eine einzelne Seite von Daten in einer PagedList Sammlung aus Ihrem IQueryable oder, IEnumerableund die PagedList Auflistung stellt mehrere Eigenschaften und Methoden bereit, die das Paging erleichtern. Das PagedList.Mvc-Paket installiert ein Paginghilfsprogramm, das die Pagingschaltflächen anzeigt.

  1. Wählen Sie im Menü Extrasdie Option NuGet-Paket-Manager und dann Paket-Manager-Konsole aus.

  2. Stellen Sie im Fenster Paket-Manager-Konsole sicher, dass die Paketquellenuget.org und das StandardprojektContosoUniversity lautet, und geben Sie dann den folgenden Befehl ein:

    Install-Package PagedList.Mvc
    
  3. Erstellen Sie das Projekt.

Hinweis

Das PageList-Paket wird nicht mehr verwaltet. Daher ist es für aktuelle Projekte besser, das X.PagedList-Paket zu verwenden. Der Standard Unterschied besteht darin, dass X.PagedList eine portable Assembly ist. Dies bedeutet, dass das Paket plattformübergreifend ist und sowohl für Webprojekte als auch für andere .NET-Projekte verwendet werden kann. Das neue Paket sollte keine Kompatibilitätsprobleme verursachen, da es seit Version 8.4 auf .NET 6 portiert wurde.

Fügen Sie Pagingfunktionen zur Indexmethode hinzu

  1. Fügen Sie in Controllers\StudentController.cs eine Anweisung für den PagedList Namespace hinzuusing:

    using PagedList;
    
  2. Ersetzen Sie die Index-Methode durch den folgenden Code:

    public ViewResult Index(string sortOrder, string currentFilter, string searchString, int? page)
    {
       ViewBag.CurrentSort = sortOrder;
       ViewBag.NameSortParm = String.IsNullOrEmpty(sortOrder) ? "name_desc" : "";
       ViewBag.DateSortParm = sortOrder == "Date" ? "date_desc" : "Date";
    
       if (searchString != null)
       {
          page = 1;
       }
       else
       {
          searchString = currentFilter;
       }
    
       ViewBag.CurrentFilter = searchString;
    
       var students = from s in db.Students
                      select s;
       if (!String.IsNullOrEmpty(searchString))
       {
          students = students.Where(s => s.LastName.Contains(searchString)
                                 || s.FirstMidName.Contains(searchString));
       }
       switch (sortOrder)
       {
          case "name_desc":
             students = students.OrderByDescending(s => s.LastName);
             break;
          case "Date":
             students = students.OrderBy(s => s.EnrollmentDate);
             break;
          case "date_desc":
             students = students.OrderByDescending(s => s.EnrollmentDate);
             break;
          default:  // Name ascending 
             students = students.OrderBy(s => s.LastName);
             break;
       }
    
       int pageSize = 3;
       int pageNumber = (page ?? 1);
       return View(students.ToPagedList(pageNumber, pageSize));
    }
    

    Dieser Code fügt der Methodensignatur einen page Parameter, einen aktuellen Sortierreihenfolgeparameter und einen aktuellen Filterparameter hinzu:

    public ActionResult Index(string sortOrder, string currentFilter, string searchString, int? page)
    

    Wenn die Seite zum ersten Mal angezeigt wird, oder wenn der Benutzer nicht auf einen Auslagerungs- oder Sortierlink geklickt hat, sind alle Parameter NULL. Wenn auf einen Auslagerungslink geklickt wird, enthält die page Variable die anzuzeigende Seitenzahl.

    Eine ViewBag Eigenschaft stellt die Ansicht mit der aktuellen Sortierreihenfolge bereit, da diese in den Auslagerungslinks enthalten sein muss, damit die Sortierreihenfolge beim Paging unverändert bleibt:

    ViewBag.CurrentSort = sortOrder;
    

    Eine andere Eigenschaft, ViewBag.CurrentFilter, stellt die Ansicht mit der aktuellen Filterzeichenfolge bereit. Dieser Wert muss in den Paginglinks enthalten sein, damit die Filtereinstellungen während des Pagingvorgangs beibehalten werden, und er muss im Textfeld wiederhergestellt werden, wenn die Seite erneut angezeigt wird. Wenn die Suchzeichenfolge während des Pagingvorgangs geändert wird, muss die Seite auf 1 zurückgesetzt werden, da der neue Filter andere Daten anzeigen kann. Die Suchzeichenfolge wird geändert, wenn ein Wert in das Textfeld eingegeben und die Schaltfläche "Senden" gedrückt wird. In diesem Fall ist der searchString Parameter nicht NULL.

    if (searchString != null)
    {
        page = 1;
    }
    else
    {
        searchString = currentFilter;
    }
    

    Am Ende der Methode konvertiert die ToPagedList Erweiterungsmethode für das Students-Objekt IQueryable die Schülerabfrage in eine einzelne Seite von Kursteilnehmern in einem Sammlungstyp, der paging unterstützt. Diese einzelne Seite der Kursteilnehmer wird dann an die Ansicht übergeben:

    int pageSize = 3;
    int pageNumber = (page ?? 1);
    return View(students.ToPagedList(pageNumber, pageSize));
    

    Die ToPagedList-Methode nimmt eine Seitenanzahl. Die beiden Fragezeichen stellen den Null-Koalescing-Operator dar. Der Nullzusammensetzungsoperator definiert einen Standardwert für einen Nullable-Typ. Der (page ?? 1)-Ausdruck bedeutet, dass page zurückgegeben wird, wenn dies über einen Wert verfügt, oder 1, wenn page gleich 0 (null) ist.

  1. Ersetzen Sie in Views\Student\Index.cshtml den vorhandenen Code durch den folgenden Code. Die Änderungen werden hervorgehoben.

    @model PagedList.IPagedList<ContosoUniversity.Models.Student>
    @using PagedList.Mvc;
    <link href="~/Content/PagedList.css" rel="stylesheet" type="text/css" />
    
    @{
        ViewBag.Title = "Students";
    }
    
    <h2>Students</h2>
    
    <p>
        @Html.ActionLink("Create New", "Create")
    </p>
    @using (Html.BeginForm("Index", "Student", FormMethod.Get))
    {
        <p>
            Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
            <input type="submit" value="Search" />
        </p>
    }
    <table class="table">
        <tr>
            <th>
                @Html.ActionLink("Last Name", "Index", new { sortOrder = ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
            </th>
            <th>
                First Name
            </th>
            <th>
                @Html.ActionLink("Enrollment Date", "Index", new { sortOrder = ViewBag.DateSortParm, currentFilter=ViewBag.CurrentFilter })
            </th>
            <th></th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                @Html.ActionLink("Edit", "Edit", new { id=item.ID }) |
                @Html.ActionLink("Details", "Details", new { id=item.ID }) |
                @Html.ActionLink("Delete", "Delete", new { id=item.ID })
            </td>
        </tr>
    }
    
    </table>
    <br />
    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
    
    @Html.PagedListPager(Model, page => Url.Action("Index", 
        new { page, sortOrder = ViewBag.CurrentSort, currentFilter = ViewBag.CurrentFilter }))
    

    Die @model-Anweisung am oberen Rand der Seite gibt an, dass die Ansicht nun ein PagedList-Objekt anstelle eines List-Objekts aufruft.

    Die using Anweisung für PagedList.Mvc gewährt Zugriff auf das MVC-Hilfsprogramm für die Pagingschaltflächen.

    Der Code verwendet eine Überladung von BeginForm , die es ermöglicht, FormMethod.Get anzugeben.

    @using (Html.BeginForm("Index", "Student", FormMethod.Get))
    {
        <p>
            Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)  
            <input type="submit" value="Search" />
        </p>
    }
    

    Der Standardmäßige BeginForm sendet Formulardaten mit einem POST, was bedeutet, dass Parameter im HTTP-Nachrichtentext und nicht in der URL als Abfragezeichenfolgen übergeben werden. Bei der Angabe von HTTP GET werden die Formulardaten als Abfragezeichenfolgen an die URL übergeben. Dadurch können Benutzer ein Lesezeichen für die URL erstellen. Die W3C-Richtlinien für die Verwendung von HTTP GET empfehlen, GET zu verwenden, wenn die Aktion nicht zu einer Aktualisierung führt.

    Das Textfeld wird mit der aktuellen Suchzeichenfolge initialisiert, sodass Beim Klicken auf eine neue Seite die aktuelle Suchzeichenfolge angezeigt wird.

    Find by name: @Html.TextBox("SearchString", ViewBag.CurrentFilter as string)
    

    Die Spaltenüberschriftenlinks verwenden die Abfragezeichenfolge, um die aktuelle Suchzeichenfolge an den Controller zu übergeben, damit Benutzer Filterergebnisse sortieren können:

    @Html.ActionLink("Last Name", "Index", new { sortOrder=ViewBag.NameSortParm, currentFilter=ViewBag.CurrentFilter })
    

    Die aktuelle Seite und die Gesamtanzahl der Seiten werden angezeigt.

    Page @(Model.PageCount < Model.PageNumber ? 0 : Model.PageNumber) of @Model.PageCount
    

    Wenn keine Seiten angezeigt werden sollen, wird "Seite 0 von 0" angezeigt. (In diesem Fall ist die Seitenzahl größer als die Seitenanzahl, da Model.PageNumber 1 und Model.PageCount 0 ist.)

    Die Auslagerungsschaltflächen werden vom PagedListPager Hilfsprogramm angezeigt:

    @Html.PagedListPager( Model, page => Url.Action("Index", new { page }) )
    

    Das PagedListPager Hilfsprogramm bietet eine Reihe von Optionen, die Sie anpassen können, einschließlich URLs und Styling. Weitere Informationen finden Sie unter TroyGoode/PagedList auf der GitHub-Website.

  2. Führen Sie die Seite aus.

    Klicken Sie auf die Paginglinks in verschiedenen Sortierreihenfolgen, um sicherzustellen, dass die Paging funktioniert. Geben Sie dann eine Suchzeichenfolge ein. Probieren Sie Paging erneut aus, um sicherzustellen, dass sie auch mit Sortier- und Filtervorgängen ordnungsgemäß funktioniert.

Erstellen einer Infoseite

Auf der Infoseite der Contoso University wird angezeigt, wie viele Studenten sich an welchem Datum angemeldet haben. Das erfordert Gruppieren und einfache Berechnungen dieser Gruppen. Um dies zu erreichen, ist Folgendes erforderlich:

  • Erstellen Sie eine Ansichtsmodellklasse für die Daten, die Sie an die Ansicht übergeben müssen.
  • Ändern Sie die About -Methode im Home Controller.
  • Ändern Sie die About Ansicht.

Erstellen des Ansichtsmodells

Erstellen Sie einen ViewModels-Ordner im Projektordner. Fügen Sie in diesem Ordner die Klassendatei EnrollmentDateGroup.cs hinzu, und ersetzen Sie den Vorlagencode durch den folgenden Code:

using System;
using System.ComponentModel.DataAnnotations;

namespace ContosoUniversity.ViewModels
{
    public class EnrollmentDateGroup
    {
        [DataType(DataType.Date)]
        public DateTime? EnrollmentDate { get; set; }

        public int StudentCount { get; set; }
    }
}

Ändern des Home-Controllers

  1. Fügen Sie in HomeController.cs am Anfang der Datei die folgenden using Anweisungen hinzu:

    using ContosoUniversity.DAL;
    using ContosoUniversity.ViewModels;
    
  2. Fügen Sie unmittelbar nach der öffnenden geschweiften Klammer für die -Klasse eine Klassenvariable für den Datenbankkontext hinzu:

    public class HomeController : Controller
    {
        private SchoolContext db = new SchoolContext();
    
  3. Ersetzen Sie die About-Methode durch den folgenden Code:

    public ActionResult About()
    {
        IQueryable<EnrollmentDateGroup> data = from student in db.Students
                   group student by student.EnrollmentDate into dateGroup
                   select new EnrollmentDateGroup()
                   {
                       EnrollmentDate = dateGroup.Key,
                       StudentCount = dateGroup.Count()
                   };
        return View(data.ToList());
    }
    

    Die LINQ-Anweisung gruppiert die Studentenentitäten nach Anmeldedatum, berechnet die Anzahl der Entitäten in jeder Gruppe und speichert die Ergebnisse in einer Sammlung von EnrollmentDateGroup-Ansichtsmodellobjekten.

  4. Fügen Sie eine Methode hinzu Dispose :

    protected override void Dispose(bool disposing)
    {
        db.Dispose();
        base.Dispose(disposing);
    }
    

Ändern der Infoansicht

  1. Ersetzen Sie den Code in der Datei Views\Home\About.cshtml durch den folgenden Code:

    @model IEnumerable<ContosoUniversity.ViewModels.EnrollmentDateGroup>
               
    @{
        ViewBag.Title = "Student Body Statistics";
    }
    
    <h2>Student Body Statistics</h2>
    
    <table>
        <tr>
            <th>
                Enrollment Date
            </th>
            <th>
                Students
            </th>
        </tr>
    
    @foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                @item.StudentCount
            </td>
        </tr>
    }
    </table>
    
  2. Führen Sie die App aus, und klicken Sie auf den Link Info .

    Die Anzahl der Kursteilnehmer für jedes Anmeldedatum wird in einer Tabelle angezeigt.

    About_page

Abrufen des Codes

Herunterladen des abgeschlossenen Projekts

Zusätzliche Ressourcen

Links zu anderen Entity Framework-Ressourcen finden Sie unter ASP.NET Datenzugriff – Empfohlene Ressourcen.

Nächste Schritte

In diesem Tutorial:

  • Hinzufügen von Spaltensortierungslinks
  • Hinzufügen eines Suchfelds
  • Hinzufügen von Paging
  • Erstellen einer Infoseite

Fahren Sie mit dem nächsten Artikel fort, um zu erfahren, wie Sie die Verbindungsresilienz und die Befehlsüberwachung verwenden.