次の方法で共有


Entity Framework 4.0 Database First と ASP.NET 4 Web Forms を使用したはじめに - パート 3

作成者: Tom Dykstra

Contoso University サンプル Web アプリケーションは、Entity Framework 4.0 と Visual Studio 2010 を使用して ASP.NET Web Forms アプリケーションを作成する方法を示しています。 チュートリアル シリーズの詳細については、シリーズの最初のチュートリアルを参照してください

データのフィルター処理、順序付け、およびグループ化

前のチュートリアルでは、 コントロールを EntityDataSource 使用してデータを表示および編集しました。 このチュートリアルでは、データをフィルター処理、並べ替え、グループ化します。 コントロールの EntityDataSource プロパティを設定してこれを行う場合、構文は他のデータ ソース コントロールとは異なります。 ただし、ご覧のように、 コントロールを QueryExtender 使用して、これらの違いを最小限に抑えることができます。

Students.aspx ページを変更して、学生をフィルター処理し、名前で並べ替え、名前を検索します。 また、[ Courses.aspx ] ページを変更して、選択した部門のコースを表示し、名前でコースを検索します。 最後に、学生の統計情報を About.aspx ページに追加します。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。学生一覧ビューと学生のテーブルが表示されています。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。[Courses by Department]\(部門別コース\) ビューと [Courses by Name]\(コース別コース\) ビューが表示されています。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。[Student Body Statistics]\(学生の本文の統計情報\) ビューと登録日のテーブルが表示されています。

[インターネット エクスプローラー] ウィンドウのスクリーンショット。[学生を名前で検索] ビューが表示され、検索クエリに文字 g が入力されています。

EntityDataSource "Where" プロパティを使用してデータをフィルター処理する

前のチュートリアルで作成した Students.aspx ページを開きます。 現在構成されているとおり、 GridView ページのコントロールにはエンティティ セットのすべての名前が People 表示されます。 ただし、null 以外の登録日を持つエンティティを Person 選択することで見つけることができる学生のみを表示する必要があります。

デザイン ビューに切り替え、コントロールを選択しますEntityDataSource[プロパティ] ウィンドウで、 Where プロパティを it.EnrollmentDate is not nullに設定します。

Image01

コントロールの プロパティEntityDataSourceで使用するWhere構文は Entity SQL です。 Entity SQL は Transact-SQL に似ていますが、データベース オブジェクトではなくエンティティで使用するようにカスタマイズされています。 式 it.EnrollmentDate is not nullでは、単語 it はクエリによって返されるエンティティへの参照を表します。 したがって、 は、 it.EnrollmentDate コントロールが EnrollmentDate 返す Person エンティティの プロパティを EntityDataSource 参照します。

ページを実行します。 学生の一覧に学生のみが含まれるようになりました。 (登録日がない行は表示されません)。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。学生一覧ビューと学生のテーブルが表示されています。

EntityDataSource "OrderBy" プロパティを使用してデータを並べ替える

また、このリストを最初に表示するときに名前順に表示することもできます。 Students.aspx ページがデザイン ビューで開いたままで、コントロールがEntityDataSource選択されたままの状態で、[プロパティ] ウィンドウで OrderBy プロパティを にit.LastName設定します。

Image05

ページを実行します。 学生の一覧が姓順に並べ替えることができるようになりました。

Image04

コントロール パラメーターを使用して "Where" プロパティを設定する

他のデータ ソース コントロールと同様に、パラメーター値を プロパティに Where 渡すことができます。 チュートリアルのパート 2 で作成した Courses.aspx ページでは、このメソッドを使用して、ユーザーがドロップダウン リストから選択した部門に関連付けられているコースを表示できます。

Courses.aspx を開き、デザイン ビューに切り替えます。 ページに 2 つ目 EntityDataSource のコントロールを追加し、 という名前を付けます CoursesEntityDataSource。 モデルにSchoolEntities接続し、EntitySetName 値として を選択Coursesします。

[ プロパティ ] ウィンドウで、[ 場所 ] プロパティ ボックスの省略記号をクリックします。 ([プロパティ] ウィンドウを使用するCoursesEntityDataSource前に、コントロールがまだ選択されていることを確認してください)。

Image06

[ 式エディター] ダイアログ ボックスが表示されます。 このダイアログ ボックスで、[ 指定されたパラメーターに基づいて Where 式を自動的に生成する] を選択し、[ パラメーターの追加] をクリックします。 パラメーターに名前を付け、[パラメーター DepartmentIDソース] の値として [コントロール] を選択し、ControlID 値として [DepartmentsDropDownList] を選択します。

Image07

[詳細プロパティの表示] をクリックし、[式エディター] ダイアログ ボックスの [プロパティ] ウィンドウで プロパティを TypeInt32変更します。

Image15

終わったら [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>

ユーザーがドロップダウン リストで選択した部署を変更すると、関連付けられているコースの一覧が自動的に変更されるようにします。 これを行うには、ドロップダウン リストを選択し、[ プロパティ ] ウィンドウで プロパティを AutoPostBackTrue設定します。

Image08

デザイナーの使用が完了したら、ソース ビューに切り替え、コントロールの プロパティと DefaultContainer name プロパティを 属性にCoursesEntityDataSourceContextTypeName="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 表示されます。

Image09

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 選択し、ウィザードの [選択 ] ボックスはそのままにします。 [プロパティ] ウィンドウで次のプロパティを設定します。

  • 学生のみをフィルター処理するには、 プロパティを Whereit.EnrollmentDate is not null設定します。
  • 登録日で結果をグループ化するには、 プロパティを GroupByit.EnrollmentDate設定します。
  • 登録日と学生の数を選択するには、 プロパティを Selectit.EnrollmentDate, Count(it.EnrollmentDate) AS NumberOfStudents設定します。
  • 登録日で結果を並べ替える場合は、 プロパティを OrderByit.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>

、、SelectGroupByおよび 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>

ページを実行して、登録日別の学生数を示す一覧を表示します。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。[Student Body Statistics]\(学生の本文の統計情報\) ビューに登録日のテーブルが表示されています。

フィルター処理と順序付けに 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>

コントロールIncludeEntityDataSource プロパティが に設定されていることに注意してくださいDepartment。 データベースでは、テーブルには Course 部門名が含まれていません。外部キー列が DepartmentID 含まれています。 データベースに直接クエリを実行する場合は、コース データと共に部門名を取得するには、 テーブルと Department テーブルをCourse結合する必要があります。 プロパティを IncludeDepartment設定することで、エンティティを取得するときに、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。 エンティティとエンティティの間のCourseDepartment関連付けは 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 指定します。

ページを実行します。 最初の表示には、すべてのコースの一覧が部門別に順に表示され、次にコースタイトル別に表示されます。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。[Courses by Department]\(部門別コース\) ビューと [Courses by Name]\(コース別コース\) ビューが表示されています。

「m」と入力し、[ 検索 ] をクリックすると、タイトルが "m" で始まるすべてのコースが表示されます (検索では大文字と小文字は区別されません)。

Image12

"Like" 演算子を使用してデータをフィルター処理する

コントロールの プロパティで 演算子をQueryExtender使用Likeすると、コントロールの StartsWithContains、および 検索の種類と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 表示されます。

Image13

テキスト ボックスに文字 "g" を入力し、[ 検索] をクリックします。 名または姓に "g" が付いた学生の一覧が表示されます。

[Internet エクスプローラー]\(インターネット エクスプローラー\) ウィンドウのスクリーンショット。検索クエリに文字 g が入力された [学生を名前で検索] ビューが表示されています。

これで、個々のテーブルのデータを表示、更新、フィルター処理、順序付け、およびグループ化しました。 次のチュートリアルでは、関連データ (マスター詳細シナリオ) の操作を開始します。