エンティティとアソシエーションのクエリ (Entity Framework クイック スタート)

ここでは、School モデルのエンティティとアソシエーションを表す CLR オブジェクトに対する厳密に型指定されたクエリを作成し、そのクエリから返されたオブジェクト コレクションに表示コントロールをバインドします。

School データベースの部署を照会するには

  1. CourseViewer フォームのコード ファイルの先頭に、次の using (C#) ステートメントまたは Imports (Visual Basic) ステートメントを追加して、School データベースから作成されたモデルおよびエンティティの名前空間を参照します。

    Imports System.Data.Objects
    Imports System.Data.Objects.DataClasses
    
    using System.Data.Objects;
    using System.Data.Objects.DataClasses;
    
  2. CourseViewer フォームに定義された部分クラスの先頭に、ObjectContext のインスタンスを作成するための次のコードを追加します。

    ' Create an ObjectContext instance based on SchoolEntity.
    Private schoolContext As SchoolEntities
    
    //Create an ObjectContext instance based on SchoolEntity
    private SchoolEntities schoolContext;
    
  3. CourseViewer フォームのデザイナーで、CourseViewer フォームをダブルクリックします。

    This opens the code page for the form and creates the courseViewer _Load event handler method.

  4. 次のコードをコピーし、courseViewer _Load イベント ハンドラー メソッドに貼り付けます。これは、DataGridView を定義するコードです。Department の (Name で並べ替えた) コレクションを取得するためのクエリを実行し、さらに、Department オブジェクトのコレクションを departmentList コントロールにバインドしています。

    ' Initialize the ObjectContext.
    schoolContext = New SchoolEntities()
    
    ' Define a query that returns all Department objects
    ' and related Course objects, ordered by name.
    Dim departmentQuery As ObjectQuery(Of Department) = _
        From d In schoolContext.Departments.Include("Courses") _
        Order By d.Name _
        Select d
    Try
        ' Bind the ComboBox control to the query.
        ' To prevent the query from being executed multiple times during binding, 
        ' it is recommended to bind controls to the result of the Execute method. 
        Me.departmentList.DisplayMember = "Name"
        Me.departmentList.DataSource = CType(departmentQuery, ObjectQuery).Execute(MergeOption.AppendOnly)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    
    //Initialize the ObjectContext
    schoolContext = new SchoolEntities();
    
    // Define a query that returns all Department  
    // objects and course objects, ordered by name.
    var departmentQuery = from d in schoolContext.Departments.Include("Courses")
                          orderby d.Name
                          select d;
    try
    {
        // Bind the ComboBox control to the query, 
        // which is executed during data binding.
        // To prevent the query from being executed multiple times during binding, 
        // it is recommended to bind controls to the result of the Execute method. 
        this.departmentList.DisplayMember = "Name";
        this.departmentList.DataSource = ((ObjectQuery)departmentQuery).Execute(MergeOption.AppendOnly);
    }
    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }
    

選択した部門のコースを表示するには

  1. In the CourseViewer form designer, double-click the departmentList control.

    This creates the departmentList_SelectedIndexChanged event handler method.

  2. 選択した部門に関連付けられているコースを読み込むための以下のコードを貼り付けます。

    Try
        ' Get the object for the selected department.
        Dim department As Department = _
            CType(Me.departmentList.SelectedItem, Department)
    
        ' Bind the grid view to the collection of Course objects 
        ' that are related to the selected Department object.
        courseGridView.DataSource = department.Courses
    
        ' Hide the columns that are bound to the navigation properties on Course.
        courseGridView.Columns("Department").Visible = False
        courseGridView.Columns("StudentGrades").Visible = False
        courseGridView.Columns("OnlineCourse").Visible = False
        courseGridView.Columns("OnsiteCourse").Visible = False
        courseGridView.Columns("People").Visible = False
        courseGridView.Columns("DepartmentId").Visible = False
    
        courseGridView.AllowUserToDeleteRows = False
    courseGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells)
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    
        try
        {
            //Get the object for the selected department.
            Department department = (Department)this.departmentList.SelectedItem;
    
            //Bind the grid view to the collection of Course objects
            // that are related to the selected Department object.
            courseGridView.DataSource = department.Courses;
    
            // Hide the columns that are bound to the navigation properties on Course.
            courseGridView.Columns["Department"].Visible = false;
            courseGridView.Columns["StudentGrades"].Visible = false;
            courseGridView.Columns["OnlineCourse"].Visible = false;
            courseGridView.Columns["OnsiteCourse"].Visible = false;
            courseGridView.Columns["People"].Visible = false;
            courseGridView.Columns["DepartmentId"].Visible = false;
    
            courseGridView.AllowUserToDeleteRows = false;
    courseGridView.AutoResizeColumns(DataGridViewAutoSizeColumnsMode.AllCells);
        }
        catch (Exception ex)
        {
            MessageBox.Show(ex.Message);
        }
    

次の手順

ここでは、Department オブジェクトおよび Course オブジェクトを取得するためのクエリを作成し、各オブジェクトをコントロールにバインドしました。 次の手順 (「データの挿入と更新 (Entity Framework クイック スタート)」) では、データ グリッドで Course オブジェクトに対して加えられた変更をデータベースに保存します。

参照

概念

概念モデルに対するクエリ (Entity Framework)
エンティティ データの使用

その他のリソース

サンプル (Entity Framework)