Share via


QueryView 要素 (MSL)

マッピング スキーマ言語 (MSL) の QueryView 要素は、概念モデルのエンティティ型またはアソシエーションと、基になるデータベースのテーブルとの間の読み取り専用のマッピングを定義します。 このマッピングは、ストレージ モデルに対して評価される Entity SQL クエリで定義されます。また、結果セットは、概念モデルのエンティティまたはアソシエーションに従って表されます。 クエリ ビューは読み取り専用であるため、標準の更新コマンドを使用してクエリ ビューで定義された型を更新することはできません。 型の更新を行うには、変更関数を使用する必要があります。 詳細については、「How to: Map Modification Functions to Stored Procedures」を参照してください。

Cc716798.note(ja-jp,VS.100).gif注 :
QueryView 要素では、GroupBy、グループ集計、またはナビゲーション プロパティを含む Entity SQL 式がサポートされていません。

QueryView 要素は、EntitySetMapping 要素または AssociationSetMapping 要素の子である場合があります。 前者の場合、クエリ ビューは、概念モデルのエンティティの読み取り専用マッピングを定義します。 後者の場合、クエリ ビューは、概念モデルのアソシエーションの読み取り専用マッピングを定義します。

Cc716798.note(ja-jp,VS.100).gif注 :
参照に関する制約のあるアソシエーションに AssociationSetMapping 要素が存在する場合、AssociationSetMapping 要素は無視されます。For more information, see ReferentialConstraint 要素 (CSDL).

The QueryView element cannot have any child elements.

適用可能な属性

The following table describes the attributes that can be applied to the QueryView element.

属性名 必須 Value

TypeName

いいえ

クエリ ビューによってマップされる概念モデル型の名前。

次の例は、EntitySetMapping 要素の子である QueryView 要素を示し、School モデルDepartment 要素型のクエリ ビュー マッピングを定義します。

<EntitySetMapping Name="Departments" >
  <QueryView>
    SELECT VALUE SchoolModel.Department(d.DepartmentID, 
                                        d.Name, 
                                        d.Budget, 
                                        d.StartDate)
    FROM SchoolModelStoreContainer.Department AS d
    WHERE d.Budget > 150000
  </QueryView>
</EntitySetMapping>

このクエリはストレージ モデルの Department 型のメンバーのサブセットのみを返すため、School モデルの Department 型は、このマッピングに基づいて次のように変更されます。

<EntityType Name="Department">
  <Key>
    <PropertyRef Name="DepartmentID" />
  </Key>
  <Property Type="Int32" Name="DepartmentID" Nullable="false" />
  <Property Type="String" Name="Name" Nullable="false" 
            MaxLength="50" FixedLength="false" Unicode="true" />
  <Property Type="Decimal" Name="Budget" Nullable="false" 
            Precision="19" Scale="4" />
  <Property Type="DateTime" Name="StartDate" Nullable="false" />
  <NavigationProperty Name="Courses" 
                      Relationship="SchoolModel.FK_Course_Department" 
                      FromRole="Department" ToRole="Course" />
</EntityType>

次の例は、AssociationSetMapping 要素の子である QueryView 要素を示し、School モデルの FK_Course_Department アソシエーションの読み取り専用のマッピングを定義します。

Cc716798.note(ja-jp,VS.100).gif注 :
アソシエーション セット マッピングがクエリ ビューによって定義されている場合、アソシエーションの End のエンティティ型のマッピングもクエリ ビューによって定義される必要があります。

<EntityContainerMapping StorageEntityContainer="SchoolModelStoreContainer" 
                        CdmEntityContainer="SchoolEntities">
  <EntitySetMapping Name="Courses" >
    <QueryView>
      SELECT VALUE SchoolModel.Course(c.CourseID, 
                                      c.Title, 
                                      c.Credits)
      FROM SchoolModelStoreContainer.Course AS c
    </QueryView>
  </EntitySetMapping>
  <EntitySetMapping Name="Departments" >
    <QueryView>
      SELECT VALUE SchoolModel.Department(d.DepartmentID, 
                                          d.Name, 
                                          d.Budget, 
                                          d.StartDate)
      FROM SchoolModelStoreContainer.Department AS d
      WHERE d.Budget > 150000
    </QueryView>
  </EntitySetMapping>
  <AssociationSetMapping Name="FK_Course_Department" >
    <QueryView>
      SELECT VALUE SchoolModel.FK_Course_Department(
        CREATEREF(SchoolEntities.Departments, row(c.DepartmentID), SchoolModel.Department),
        CREATEREF(SchoolEntities.Courses, row(c.CourseID)) )
      FROM SchoolModelStoreContainer.Course AS c
    </QueryView>
  </AssociationSetMapping>
</EntityContainerMapping>

コメント

クエリ ビューを定義して、次のシナリオを実現できます。

  • ストレージ モデルのエンティティのプロパティの一部を含まない、概念モデルのエンティティを定義する。 これには、既定値がないプロパティや null 値をサポートしないプロパティが含まれます。

  • ストレージ モデルの計算列を概念モデルのエンティティ型のプロパティにマップする。

  • 概念モデルのエンティティをパーティション分割するために使用される条件が等価性に基づかないマッピングを定義する。 Condition 要素を使用して条件のマッピングを指定する場合、指定する条件は、指定する値と同等である必要があります。 詳細については、「Condition 要素 (MSL)」を参照してください。

  • ストレージ モデルの同一の列を概念モデルの複数の型にマップする。

  • 複数の型を同じテーブルにマップする。

  • リレーショナル スキーマの外部キーに基づかない概念モデルのアソシエーションを定義する。

  • カスタム ビジネス ロジックを使用して、概念モデルのプロパティの値を設定する。 たとえば、データ ソースの文字列値 "T" を概念モデルの true の値 (Boolean) にマップすることもできます。

  • クエリ結果に対する条件付きフィルターを定義する。

  • 概念モデルのデータに適用する制限をストレージ モデルよりも少なくする。 たとえば、概念モデルのプロパティについて、マップ先の列で null 値がサポートされなくても、NULL 値が許容されるプロパティにすることもできます。

エンティティのクエリ ビューを定義する際は、次の点に注意してください。

  • クエリ ビューは読み取り専用です。 エンティティの更新を行うには、変更関数を使用する必要があります。

  • クエリ ビューでエンティティ型を定義する場合、すべての関連エンティティもクエリ ビューで定義する必要があります。

  • リレーショナル スキーマのリンク テーブルを表すストレージ モデルのエンティティに多対多のアソシエーションをマップする場合、このリンク テーブルの AssociationSetMapping 要素の QueryView 要素を定義する必要があります。

  • クエリ ビューは、型階層のすべての型に対して定義する必要があります。 これは、次の方法で行うことができます。

    • 単一の QueryView 要素を使用し、その要素で、階層のすべてのエンティティ型の和集合を返す単一の Entity SQL クエリを指定します。

    • 単一の QueryView 要素を使用し、その要素で、CASE 演算子を使用して特定の条件に基づいて階層の特定のエンティティ型を返す単一の Entity SQL クエリを指定します。

    • 階層の特定の型に対して追加の QueryView 要素を使用します。 この場合、QueryView 要素の TypeName 属性を使用して、各ビューのエンティティ型を指定します。

  • クエリ ビューを定義するときに、EntitySetMapping 要素の StorageSetName 属性を指定することはできません。

  • クエリ ビューを定義するときに、EntitySetMapping 要素に Property マッピングを含めることもできません。

参照

概念

EntitySetMapping 要素 (MSL)
AssociationSetMapping 要素 (MSL)

その他のリソース

CSDL、SSDL、および MSL 仕様
モデリングとマッピング (Entity Framework)