Entity Framework 4.0 Database First と ASP.NET 4 Web Forms を使用したはじめに - パート 3
Contoso University サンプル Web アプリケーションは、Entity Framework 4.0 と Visual Studio 2010 を使用して ASP.NET Web Forms アプリケーションを作成する方法を示しています。 チュートリアル シリーズの詳細については、シリーズの最初のチュートリアルを参照してください
データのフィルター処理、順序付け、およびグループ化
前のチュートリアルでは、 コントロールを EntityDataSource
使用してデータを表示および編集しました。 このチュートリアルでは、データをフィルター処理、並べ替え、グループ化します。 コントロールの EntityDataSource
プロパティを設定してこれを行う場合、構文は他のデータ ソース コントロールとは異なります。 ただし、ご覧のように、 コントロールを QueryExtender
使用して、これらの違いを最小限に抑えることができます。
Students.aspx ページを変更して、学生をフィルター処理し、名前で並べ替え、名前を検索します。 また、[ Courses.aspx ] ページを変更して、選択した部門のコースを表示し、名前でコースを検索します。 最後に、学生の統計情報を About.aspx ページに追加します。
EntityDataSource "Where" プロパティを使用してデータをフィルター処理する
前のチュートリアルで作成した Students.aspx ページを開きます。 現在構成されているとおり、 GridView
ページのコントロールにはエンティティ セットのすべての名前が People
表示されます。 ただし、null 以外の登録日を持つエンティティを Person
選択することで見つけることができる学生のみを表示する必要があります。
デザイン ビューに切り替え、コントロールを選択しますEntityDataSource
。 [プロパティ] ウィンドウで、 Where
プロパティを it.EnrollmentDate is not null
に設定します。
コントロールの プロパティEntityDataSource
で使用するWhere
構文は Entity SQL です。 Entity SQL は Transact-SQL に似ていますが、データベース オブジェクトではなくエンティティで使用するようにカスタマイズされています。 式 it.EnrollmentDate is not null
では、単語 it
はクエリによって返されるエンティティへの参照を表します。 したがって、 は、 it.EnrollmentDate
コントロールが EnrollmentDate
返す Person
エンティティの プロパティを EntityDataSource
参照します。
ページを実行します。 学生の一覧に学生のみが含まれるようになりました。 (登録日がない行は表示されません)。
EntityDataSource "OrderBy" プロパティを使用してデータを並べ替える
また、このリストを最初に表示するときに名前順に表示することもできます。 Students.aspx ページがデザイン ビューで開いたままで、コントロールがEntityDataSource
選択されたままの状態で、[プロパティ] ウィンドウで OrderBy プロパティを にit.LastName
設定します。
ページを実行します。 学生の一覧が姓順に並べ替えることができるようになりました。
コントロール パラメーターを使用して "Where" プロパティを設定する
他のデータ ソース コントロールと同様に、パラメーター値を プロパティに Where
渡すことができます。 チュートリアルのパート 2 で作成した Courses.aspx ページでは、このメソッドを使用して、ユーザーがドロップダウン リストから選択した部門に関連付けられているコースを表示できます。
Courses.aspx を開き、デザイン ビューに切り替えます。 ページに 2 つ目 EntityDataSource
のコントロールを追加し、 という名前を付けます CoursesEntityDataSource
。 モデルにSchoolEntities
接続し、EntitySetName 値として を選択Courses
します。
[ プロパティ ] ウィンドウで、[ 場所 ] プロパティ ボックスの省略記号をクリックします。 ([プロパティ] ウィンドウを使用するCoursesEntityDataSource
前に、コントロールがまだ選択されていることを確認してください)。
[ 式エディター] ダイアログ ボックスが表示されます。 このダイアログ ボックスで、[ 指定されたパラメーターに基づいて Where 式を自動的に生成する] を選択し、[ パラメーターの追加] をクリックします。 パラメーターに名前を付け、[パラメーター DepartmentID
ソース] の値として [コントロール] を選択し、ControlID 値として [DepartmentsDropDownList] を選択します。
[詳細プロパティの表示] をクリックし、[式エディター] ダイアログ ボックスの [プロパティ] ウィンドウで プロパティを Type
にInt32
変更します。
終わったら [OK] をクリックします。
ドロップダウン リストの下に、ページにコントロールを GridView
追加し、 という名前を付けます CoursesGridView
。 データ ソース コントロールに接続し、[スキーマのCoursesEntityDataSource
更新] をクリックし、[列の編集] をクリックして列をDepartmentID
削除します。 コントロール マークアップは GridView
、次の例のようになります。
<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>
ユーザーがドロップダウン リストで選択した部署を変更すると、関連付けられているコースの一覧が自動的に変更されるようにします。 これを行うには、ドロップダウン リストを選択し、[ プロパティ ] ウィンドウで プロパティを AutoPostBack
に True
設定します。
デザイナーの使用が完了したら、ソース ビューに切り替え、コントロールの プロパティと DefaultContainer
name プロパティを 属性にCoursesEntityDataSource
ContextTypeName="ContosoUniversity.DAL.SchoolEntities"
置き換えますConnectionString
。 完了すると、コントロールのマークアップは次の例のようになります。
<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>
ページを実行し、ドロップダウン リストを使用してさまざまな部門を選択します。 選択した部門によって提供されるコースのみがコントロールに GridView
表示されます。
EntityDataSource "GroupBy" プロパティを使用してデータをグループ化する
Contoso University が[About]\(バージョン情報\) ページにいくつかの学生の身体統計を配置するとします。 具体的には、学生の内訳を登録日別に表示する必要があります。
About.aspx を開き、[ソース] ビューで、コントロールの既存の内容をBodyContent
タグ間h2
の "Student Body Statistics" に置き換えます。
<asp:Content ID="BodyContent" runat="server" ContentPlaceHolderID="MainContent">
<h2>Student Body Statistics</h2>
</asp:Content>
見出しの後にコントロールを EntityDataSource
追加し、 という名前を付けます StudentStatisticsEntityDataSource
。 に接続し SchoolEntities
、エンティティ セットを People
選択し、ウィザードの [選択 ] ボックスはそのままにします。 [プロパティ] ウィンドウで次のプロパティを設定します。
- 学生のみをフィルター処理するには、 プロパティを
Where
にit.EnrollmentDate is not null
設定します。 - 登録日で結果をグループ化するには、 プロパティを
GroupBy
にit.EnrollmentDate
設定します。 - 登録日と学生の数を選択するには、 プロパティを
Select
にit.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents
設定します。 - 登録日で結果を並べ替える場合は、 プロパティを
OrderBy
にit.EnrollmentDate
設定します。
ソース ビューで、 プロパティと DefaultContainer
name プロパティを ConnectionString
プロパティにContextTypeName
置き換えます。 コントロール マークアップは EntityDataSource
次の例のようになります。
<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
GroupBy
および Where
プロパティの構文は、現在のエンティティを指定するキーワード (keyword)をit
除き、Transact-SQL に似ています。
次のマークアップを追加して、データを GridView
表示するコントロールを作成します。
<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>
ページを実行して、登録日別の学生数を示す一覧を表示します。
フィルター処理と順序付けに QueryExtender コントロールを使用する
コントロールは QueryExtender
、マークアップでフィルター処理と並べ替えを指定する方法を提供します。 構文は、使用しているデータベース管理システム (DBMS) とは独立しています。 また、一般に Entity Framework には依存しませんが、ナビゲーション プロパティに使用する構文は Entity Framework に固有である点が異なります。
チュートリアルのこの部分では、コントロールを QueryExtender
使用してデータをフィルター処理して並べ替え、並べ替えフィールドの 1 つがナビゲーション プロパティになります。
(マークアップの代わりにコードを使用して、コントロールによって自動的に生成されるクエリを EntityDataSource
拡張する場合は、 イベントを QueryCreated
処理することでこれを行うことができます。これは、コントロールが QueryExtender
コントロール クエリを拡張 EntityDataSource
する方法です)。
Courses.aspx ページを開き、前に追加したマークアップの下に次のマークアップを挿入して、見出し、検索文字列を入力するためのテキスト ボックス、検索ボタン、エンティティ EntityDataSource
セットにバインドされたコントロールをCourses
作成します。
<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>
コントロールInclude
の EntityDataSource
プロパティが に設定されていることに注意してくださいDepartment
。 データベースでは、テーブルには Course
部門名が含まれていません。外部キー列が DepartmentID
含まれています。 データベースに直接クエリを実行する場合は、コース データと共に部門名を取得するには、 テーブルと Department
テーブルをCourse
結合する必要があります。 プロパティを Include
に Department
設定することで、エンティティを取得するときに、Entity Framework が関連 Department
エンティティを取得する作業を Course
実行するように指定します。 エンティティは Department
、エンティティの Department
ナビゲーション プロパティに Course
格納されます。 (既定では、SchoolEntities
データ モデル デザイナーによって生成されたクラスは、必要に応じて関連データを取得し、データ ソース コントロールをそのクラスにバインドしているため、 プロパティをInclude
設定する必要はありません。ただし、これを設定するとページのパフォーマンスが向上します。そうしないと、Entity Framework によってデータベースが個別に呼び出され、エンティティと関連Department
エンティティのデータCourse
が取得されるためです)。
先ほど作成したコントロールの EntityDataSource
後に、次のマークアップを挿入して、 QueryExtender
その EntityDataSource
コントロールにバインドされたコントロールを作成します。
<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
、テキスト ボックスに入力した値とタイトルが一致するコースを選択することを指定します。 プロパティで が指定StartsWith
されているためSearchType
、テキスト ボックスに入力された文字数だけが比較されます。
要素は OrderByExpression
、結果セットが部門名内のコース タイトルで並べ替えられることを指定します。 部署名の指定方法に注目してください: Department.Name
。 エンティティとエンティティの間のCourse
Department
関連付けは 1 対 1 であるため、Department
ナビゲーション プロパティにはエンティティがDepartment
含まれます。 (これが一対多リレーションシップの場合、 プロパティにはコレクションが含まれます)。部署名を取得するには、エンティティの プロパティを Name
指定する Department
必要があります。
最後に、コースの GridView
一覧を表示するコントロールを追加します。
<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>
最初の列は、部署名を表示するテンプレート フィールドです。 databinding 式は、 Department.Name
コントロールで見たのと同じように を QueryExtender
指定します。
ページを実行します。 最初の表示には、すべてのコースの一覧が部門別に順に表示され、次にコースタイトル別に表示されます。
「m」と入力し、[ 検索 ] をクリックすると、タイトルが "m" で始まるすべてのコースが表示されます (検索では大文字と小文字は区別されません)。
"Like" 演算子を使用してデータをフィルター処理する
コントロールの プロパティで 演算子をQueryExtender
使用Like
すると、コントロールの StartsWith
、Contains
、および 検索の種類とEndsWith
同様のWhere
効果をEntityDataSource
得ることができます。 チュートリアルのこの部分では、 演算子を使用 Like
して学生を名前で検索する方法について説明します。
ソース ビューで Students.aspx を開きます。 コントロールの後に GridView
、次のマークアップを追加します。
<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>
このマークアップは、プロパティ値を除き、前に見たマークアップと Where
似ています。 式の 2 番目の Where
部分は、テキスト ボックスに入力されたものを姓と名の両方で検索する部分文字列検索 (LIKE %FirstMidName% or LIKE %LastName%
) を定義します。
ページを実行します。 最初は、パラメーターの既定値が "%" であるため、すべての学生が StudentName
表示されます。
テキスト ボックスに文字 "g" を入力し、[ 検索] をクリックします。 名または姓に "g" が付いた学生の一覧が表示されます。
これで、個々のテーブルのデータを表示、更新、フィルター処理、順序付け、およびグループ化しました。 次のチュートリアルでは、関連データ (マスター詳細シナリオ) の操作を開始します。
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示