Introduzione con Entity Framework 4.0 Database First e ASP.NET 4 Web Forms - Parte 3
di Tom Dykstra
L'applicazione Web di esempio Contoso University illustra come creare applicazioni Web Forms ASP.NET usando Entity Framework 4.0 e Visual Studio 2010. Per informazioni sulla serie di esercitazioni, vedere la prima esercitazione nella serie
Filtro, ordinamento e raggruppamento dei dati
Nell'esercitazione precedente è stato usato il EntityDataSource
controllo per visualizzare e modificare i dati. In questa esercitazione verranno filtrati, ordinati e raggruppati i dati. Quando si esegue questa operazione impostando le proprietà del EntityDataSource
controllo, la sintassi è diversa da altri controlli origine dati. Come si vedrà, tuttavia, è possibile usare il QueryExtender
controllo per ridurre al minimo queste differenze.
La pagina Students.aspx verrà modificata per filtrare gli studenti, ordinare in base al nome e cercare il nome. Si cambierà anche la pagina Courses.aspx per visualizzare i corsi per il reparto selezionato e cercare corsi in base al nome. Infine, si aggiungeranno le statistiche degli studenti alla pagina About.aspx .
Uso della proprietà EntityDataSource "Where" per filtrare i dati
Aprire la pagina Students.aspx creata nell'esercitazione precedente. Come configurato, il GridView
controllo nella pagina visualizza tutti i nomi del People
set di entità. Tuttavia, si vuole mostrare solo gli studenti, che è possibile trovare selezionando Person
entità con date di registrazione non null.
Passare alla visualizzazione Progettazione e selezionare il EntityDataSource
controllo. Nella finestra Proprietà impostare la proprietà Where
su it.EnrollmentDate is not null
.
La sintassi usata nella Where
proprietà del EntityDataSource
controllo è Entity SQL. Entity SQL è simile a Transact-SQL, ma viene personalizzato per l'uso con entità anziché con oggetti di database. Nell'espressione it.EnrollmentDate is not null
, la parola it
rappresenta un riferimento all'entità restituita dalla query. Pertanto, it.EnrollmentDate
fa riferimento alla EnrollmentDate
proprietà dell'entità Person
restituita dal EntityDataSource
controllo.
Eseguire la pagina. L'elenco degli studenti contiene solo studenti. Non sono visualizzate righe in cui non è presente alcuna data di registrazione.
Uso della proprietà EntityDataSource "OrderBy" per ordinare i dati
Si vuole anche che questo elenco sia in ordine di nome quando viene visualizzato per la prima volta. Con la pagina Students.aspx ancora aperta nella visualizzazione Progettazione e con il EntityDataSource
controllo ancora selezionato, nella finestra Proprietà impostare la proprietà OrderBy su it.LastName
.
Eseguire la pagina. L'elenco degli studenti è ora in ordine per cognome.
Uso di un parametro di controllo per impostare la proprietà "Where"
Come per altri controlli origine dati, è possibile passare i valori dei parametri alla Where
proprietà. Nella pagina Courses.aspx creata nella parte 2 dell'esercitazione è possibile usare questo metodo per visualizzare i corsi associati al reparto selezionato dall'elenco a discesa.
Aprire Courses.aspx e passare alla visualizzazione Progettazione . Aggiungere un secondo EntityDataSource
controllo alla pagina e denominarlo CoursesEntityDataSource
. Connettersi al SchoolEntities
modello e selezionare Courses
come valore EntitySetName .
Nella finestra Proprietà fare clic sui puntini di sospensione nella casella Where property . Assicurarsi che il controllo sia ancora selezionato prima di usare la CoursesEntityDataSource
finestra Proprietà .
Viene visualizzata la finestra di dialogo Editor espressioni . In questa finestra di dialogo selezionare Genera automaticamente l'espressione Where in base ai parametri specificati e quindi fai clic su Aggiungi parametro. Assegnare un nome al parametro DepartmentID
, selezionare Controllo come valore di origine parametro e selezionare DepartmentsDropDownList come valore ControlID .
Fare clic su Mostra proprietà avanzate e nella finestra Proprietà della finestra di dialogo Editor espressioni modificare la Type
proprietà in Int32
.
Al termine, fare clic su OK.
Sotto l'elenco a discesa aggiungere un GridView
controllo alla pagina e denominarlo CoursesGridView
. Connettersi al CoursesEntityDataSource
controllo origine dati, fare clic su Aggiorna schema, fare clic su Modifica colonne e rimuovere la DepartmentID
colonna. Il markup del GridView
controllo è simile all'esempio seguente.
<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>
Quando l'utente modifica automaticamente il reparto selezionato nell'elenco a discesa, si vuole che l'elenco dei corsi associati cambi automaticamente. Per eseguire questa operazione, selezionare l'elenco a discesa e nella finestra Proprietà impostare la AutoPostBack
proprietà su True
.
Dopo aver completato l'uso della finestra di progettazione, passare alla visualizzazione Origine e sostituire le ConnectionString
proprietà e DefaultContainer
del nome del CoursesEntityDataSource
controllo con l'attributo ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
. Al termine, il markup per il controllo sarà simile all'esempio seguente.
<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>
Eseguire la pagina e usare l'elenco a discesa per selezionare diversi reparti. Nel controllo vengono visualizzati GridView
solo i corsi offerti dal reparto selezionato.
Uso della proprietà EntityDataSource "GroupBy" per raggruppare i dati
Si supponga che Contoso University voglia inserire alcune statistiche sul corpo degli studenti nella relativa pagina Informazioni. In particolare, vuole mostrare una suddivisione dei numeri di studenti entro la data di iscrizione.
Aprire About.aspx e nella visualizzazione Origine sostituire il contenuto esistente del BodyContent
controllo con "Student Body Statistics" tra h2
i tag:
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
Dopo l'intestazione, aggiungere un EntityDataSource
controllo e denominarlo StudentStatisticsEntityDataSource
. Connettersi a SchoolEntities
, selezionare il set di entità e lasciare invariata la People
casella Seleziona nella procedura guidata. Impostare le proprietà seguenti nella finestra Proprietà :
- Per filtrare solo gli studenti, impostare la
Where
proprietà suit.EnrollmentDate is not null
. - Per raggruppare i risultati in base alla data di registrazione, impostare la
GroupBy
proprietà suit.EnrollmentDate
. - Per selezionare la data di registrazione e il numero di studenti, impostare la
Select
proprietà suit.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents
. - Per ordinare i risultati in base alla data di registrazione, impostare la
OrderBy
proprietà suit.EnrollmentDate
.
Nella visualizzazione Origine sostituire le ConnectionString
proprietà e DefaultContainer
nome con una ContextTypeName
proprietà. Il markup del EntityDataSource
controllo ora è simile all'esempio seguente.
<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>
La sintassi delle proprietà , GroupBy
e Where
è simile a Transact-SQL, ad eccezione it
della Select
parola chiave che specifica l'entità corrente.
Aggiungere il markup seguente per creare un GridView
controllo per visualizzare i dati.
<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>
Eseguire la pagina per visualizzare un elenco che mostra il numero di studenti in base alla data di registrazione.
Uso del controllo QueryExtender per il filtro e l'ordinamento
Il controllo consente di specificare il filtro e l'ordinamento QueryExtender
nel markup. La sintassi è indipendente dal sistema di gestione del database (DBMS) in uso. È anche in genere indipendente da Entity Framework, con l'eccezione che la sintassi usata per le proprietà di spostamento è univoca per Entity Framework.
In questa parte dell'esercitazione si userà un QueryExtender
controllo per filtrare e ordinare i dati e uno dei campi order-by sarà una proprietà di spostamento.
Se si preferisce usare il codice anziché il markup per estendere le query generate automaticamente dal controllo, è possibile gestire l'evento EntityDataSource
QueryCreated
. Questo è il modo in cui il QueryExtender
controllo estende EntityDataSource
anche le query di controllo.
Aprire la pagina Courses.aspx e sotto il markup aggiunto in precedenza, inserire il markup seguente per creare un'intestazione, una casella di testo per immettere stringhe di ricerca, un pulsante di ricerca e un EntityDataSource
controllo associato al Courses
set di entità.
<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>
Si noti che la EntityDataSource
proprietà del Include
controllo è impostata su Department
. Nel database la Course
tabella non contiene il nome del reparto. Contiene una DepartmentID
colonna chiave esterna. Se si esegue una query diretta sul database, per ottenere il nome del reparto insieme ai dati del corso, è necessario aggiungere le Course
tabelle e Department
. Impostando la Include
proprietà su Department
, si specifica che Entity Framework deve eseguire il lavoro di ottenere l'entità correlata Department
quando ottiene un'entità Course
. L'entità Department
viene quindi archiviata nella Department
proprietà di spostamento dell'entità Course
. Per impostazione predefinita, la SchoolEntities
classe generata dalla finestra di progettazione modelli di dati recupera i dati correlati quando è necessaria e il controllo origine dati è associato a tale classe, quindi l'impostazione della Include
proprietà non è necessaria. Tuttavia, impostandolo migliora le prestazioni della pagina, perché in caso contrario, Entity Framework effettua chiamate separate al database per recuperare i dati per Course
le entità e per le entità correlate Department
.
Dopo aver appena creato il controllo, inserire il EntityDataSource
markup seguente per creare un QueryExtender
controllo associato a tale EntityDataSource
controllo.
<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>
L'elemento SearchExpression
specifica che si desidera selezionare corsi i cui titoli corrispondono al valore immesso nella casella di testo. Verrà confrontato solo il numero di caratteri immessi StartsWith
nella casella di testo, perché la SearchType
proprietà specifica .
L'elemento OrderByExpression
specifica che il set di risultati verrà ordinato in base al titolo del corso all'interno del nome del reparto. Si noti il modo in cui viene specificato il nome del reparto: Department.Name
. Poiché l'associazione tra l'entità e l'entità Course
Department
è uno-a-uno, la Department
proprietà di spostamento contiene un'entità Department
. Se si tratta di una relazione uno-a-molti, la proprietà conterrà una raccolta. Per ottenere il nome del reparto, è necessario specificare la Name
proprietà dell'entità Department
.
Infine, aggiungere un GridView
controllo per visualizzare l'elenco dei corsi:
<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>
La prima colonna è un campo modello che visualizza il nome del reparto. L'espressione databinding specifica Department.Name
, esattamente come si è visto nel QueryExtender
controllo.
Eseguire la pagina. La visualizzazione iniziale mostra un elenco di tutti i corsi in ordine per reparto e quindi in base al titolo del corso.
Immettere "m" e fare clic su Cerca per visualizzare tutti i corsi i cui titoli iniziano con "m" (la ricerca non è distinzione tra maiuscole e minuscole).
Uso dell'operatore "Like" per filtrare i dati
È possibile ottenere un effetto simile ai QueryExtender
tipi di ricerca , Contains
e EndsWith
del StartsWith
controllo usando un Like
operatore nella EntityDataSource
proprietà del Where
controllo. In questa parte dell'esercitazione si vedrà come usare l'operatore Like
per cercare uno studente in base al nome.
Aprire Students.aspx nella visualizzazione Origine . Dopo il controllo, aggiungere il GridView
markup seguente:
<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>
Questo markup è simile a quello visualizzato in precedenza, ad eccezione del valore della Where
proprietà. La seconda parte dell'espressione Where
definisce una ricerca sottostringa (LIKE %FirstMidName% or LIKE %LastName%
) che cerca sia i primi che i cognome per qualsiasi elemento immesso nella casella di testo.
Eseguire la pagina. Inizialmente vengono visualizzati tutti gli studenti perché il valore predefinito per il StudentName
parametro è "%".
Immettere la lettera "g" nella casella di testo e fare clic su Cerca. Viene visualizzato un elenco di studenti che hanno un "g" nel nome o nel cognome.
Sono stati ora visualizzati, aggiornati, filtrati, ordinati e raggruppati dati da singole tabelle. Nell'esercitazione successiva si inizierà a usare i dati correlati (scenari di dettaglio master).