方法: 定義クエリを追加する (Entity Framework)
このトピックでは、定義クエリと対応する概念エンティティ型を .edmx ファイルに追加する方法を説明します。 定義クエリを使用すると、.edmx ファイルの DefiningQuery 要素で指定されている SQL ステートメントを実行できます。 詳細については、「DefiningQuery Element (EntitiContainer SSDL)」を参照してください。 通常、定義クエリは、データベース ビューとよく似た機能を提供するために使用されますが、データベースではなく .edmx ファイルでビューが定義されます。 概念エンティティ型は、概念レイヤーで定義クエリによって公開されたデータを表示するために使用します。
![]() |
---|
定義クエリなど、ストレージ モデルに加えた変更は、モデルの更新ウィザードを実行すると上書きされます。 |
パラメーター化されたクエリを定義クエリとして実行することはできません。 既定では、定義クエリを使用して表示されるデータは読み取り専用です。 ただし、データを表示するエンティティ型の挿入、更新、および削除関数をストアド プロシージャにマッピングすると、データを更新できます。 詳細については、「方法: 変更関数をストアド プロシージャにマップする (Entity Data Model ツール)」および「チュートリアル: ストアド プロシージャへのエンティティのマッピング (Entity Data Model ツール)」を参照してください。
以下の手順は、定義クエリと概念エンティティ型を .edmx ファイルに追加する方法の概要を示します。 各手順の詳しい説明は、その後の例で示します。
次の手順は、Visual Studio で有効な .edmx ファイルを開いていることを前提としています。
定義クエリの追加
定義クエリを追加するには
.edmx ファイルの SSDL セクションに EntitySet 要素を追加します。 EntitySet 要素の Name 属性と EntityType 属性のみを指定します。 詳細については、「EntitySet Element (EntityContainer SSDL)」を参照してください。
新しく追加した EntitySet 要素に DefiningQuery 要素を追加します。 DefiningQuery 要素の本体で実行する SQL ステートメントを指定します。 詳細については、「DefiningQuery Element (EntitiContainer SSDL)」を参照してください。
.edmx ファイルの SSDL セクションに EntityType 要素を追加します。 この EntityType 要素は、DefiningQuery 要素の SQL ステートメントから返される列を記述する必要があります。 詳細については、「EntityType Element (SSDL)」を参照してください。
概念モデルへのエンティティ型の追加
概念エンティティ型を追加するには
.edmx ファイルの CSDL セクションに EntitySet 要素を追加します。 詳細については、「EntitySet Element (EntityContainer CSDL)」を参照してください。
.edmx ファイルの CSDL セクションに EntityType 要素を追加します。 Name 属性は、前の手順の EntitySet 要素の Name 属性と同じ値である必要があります。 エンティティ型のプロパティは、上記の手順の DefiningQuery 要素で指定する SQL ステートメントから返されるデータにマップされます。 詳細については、「EntityType Element (CSDL)」を参照してください。
概念エンティティ型とストレージ エンティティ型のマップ
概念エンティティ型とストレージ エンティティ型をマップするには
- 前の 2 つの手順で概念エンティティとストレージ エンティティをマップする EntitySetMapping 要素を .edmx ファイルのマッピング セクションに追加します。 詳細については、「EntitySetMapping Element (MSL)」および「Mapping a Conceptual Model to a Storage Schema」を参照してください。
例
次の例では、定義クエリを School.edmx ファイルに追加し、GradeReport エンティティ型を使用して学生の成績に関する情報を表示します。 School.edmx ファイルは、Entity Framework Quickstart のトピック「School Entity Data Model の生成」の手順に従って生成できます。
定義クエリを追加するには、まず DefiningQuery 要素を格納している次の EntitySet 要素を .edmx ファイルの SSDL セクションに追加します。 次の点に注意してください。
EntitySet 要素の Name 属性と EntityType 属性のみを指定します。
EntityType 属性ではエンティティ型の完全修飾名を使用します。
実行する SQL ステートメントを DefiningQuery 要素で指定します。
<EntitySet Name="GradeReport"
EntityType="SchoolModel.Store.GradeReport" >
<DefiningQuery>
SELECT CourseID, Grade, FirstName, LastName
FROM StudentGrade
JOIN
(SELECT * FROM Person WHERE EnrollmentDate IS NOT NULL) AS p
ON StudentID = p.PersonID
</DefiningQuery>
</EntitySet>
次に、.edmx ファイルの SSDL セクションに次の EntityType 要素を追加します。 ファイルの SSDL セクションに次の EntityType 要素を追加します。 次の点に注意してください。
エンティティ型の完全修飾名は EntityType 属性で使用されますが、Name 属性の値は、上記の EntitySet 要素の EntityType 属性の値に対応します。
プロパティ名は、上記の DefiningQuery 要素の SQL ステートメントから返される列名に対応します。
この例では、キー値が一意になるように、エンティティ キーは 3 つのプロパティで構成されています。
<EntityType Name="GradeReport">
<Key>
<PropertyRef Name="CourseID" />
<PropertyRef Name="FirstName" />
<PropertyRef Name="LastName" />
</Key>
<Property Name="CourseID"
Type="int"
Nullable="false" />
<Property Name="Grade"
Type="decimal"
Precision="3"
Scale="2" />
<Property Name="FirstName"
Type="nvarchar"
Nullable="false"
MaxLength="50" />
<Property Name="LastName"
Type="nvarchar"
Nullable="false"
MaxLength="50" />
</EntityType>
エンティティ型を概念モデルに追加するには、まず次の EntitySet 要素を .edmx ファイルの CSDL セクションに追加します。 EntityType 属性ではエンティティ型の完全修飾名を使用する点に注意してください。
<EntitySet Name="GradeReport" EntityType="SchoolModel.GradeReport" />
次に、.edmx ファイルの CSDL セクションに次の EntityType 要素を追加します。 次の点に注意してください。
エンティティ型の完全修飾名は EntityType 属性で使用されますが、Name 属性の値は、上記の EntitySet 要素の EntityType 属性の値に対応します。
プロパティ名は、上記の DefiningQuery 要素の SQL ステートメントから返される列名に対応します。
この例では、キー値が一意になるように、エンティティ キーは 3 つのプロパティで構成されています。
<EntityType Name="GradeReport">
<Key>
<PropertyRef Name="CourseID" />
<PropertyRef Name="FirstName" />
<PropertyRef Name="LastName" />
</Key>
<Property Name="CourseID"
Type="Int32"
Nullable="false" />
<Property Name="Grade"
Type="Decimal"
Precision="3"
Scale="2" />
<Property Name="FirstName"
Type="String"
Nullable="false"
MaxLength="50"
Unicode="true"
FixedLength="false" />
<Property Name="LastName"
Type="String"
Nullable="false"
MaxLength="50"
Unicode="true"
FixedLength="false" />
</EntityType>
概念エンティティ型とストレージ エンティティ型をマップするには、次の EntitySetMapping 要素を .edmx ファイルのマッピング セクションに追加します。
<EntitySetMapping Name="GradeReport">
<EntityTypeMapping TypeName="IsTypeOf(SchoolModel.GradeReport)">
<MappingFragment StoreEntitySet="GradeReport">
<ScalarProperty Name="CourseID" ColumnName="CourseID" />
<ScalarProperty Name="Grade" ColumnName="Grade" />
<ScalarProperty Name="FirstName" ColumnName="FirstName" />
<ScalarProperty Name="LastName" ColumnName="LastName" />
</MappingFragment>
</EntityTypeMapping>
</EntitySetMapping>
これで GradeReport エンティティ型が School モデルに追加されます。 なお、GradeReport エンティティ型から表示されるデータは読み取り専用です。
参照
概念
.edmx ファイルの概要 (Entity Framework)