QueryView 要素 (EntitySetMapping)

エンティティ データ モデル (EDM) では、EntitySetMappingQueryView 要素は、概念モデルのエンティティとストレージ モデルのエンティティの間の読み取り専用のマッピングを定義します。ストレージ モデルに対して評価される Entity SQL クエリでこのクエリ ビュー マッピングを定義し、概念モデルのエンティティに従って結果セットを表現します。クエリ ビューは読み取り専用であるため、標準の更新コマンドを使用してクエリ ビューで定義された型を更新することはできません。型の更新を行うには、変更関数を使用する必要があります。詳細については、「変更関数をストアド プロシージャにマップする方法」を参照してください。

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

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

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

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

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

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

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

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

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

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

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

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

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

  • リレーショナル スキーマのリンク テーブルを表すストレージ モデルのエンティティに多対多のアソシエーションをマップする場合、このリンク テーブルの AssociationSetMapping 要素の QueryView 要素を定義する必要があります。詳細については、「QueryView 要素 (AssociationSetMapping)」を参照してください。

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

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

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

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

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

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

次の例では、AdventureWorks Sales Model の Product エンティティ型のクエリ ビューを定義します。

<EntitySetMapping Name="Product">
  <QueryView>
      SELECT VALUE AdventureWorksModel.Product(P.ProductID,
      P.Name, P.ProductNumber, P.Color, P.ListPrice, P.Size, P.Weight,
      P.Style)
      FROM Person.Product as P
  </QueryView>
</EntitySetMapping>

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

  <EntityType Name="Product">
  <Key>
    <PropertyRef Name="ProductID" />
  </Key>
  <Property Name="ProductID" Type="Int32" Nullable="false" />
  <Property Name="Name" Type="String" Nullable="false" MaxLength="50" Unicode="true" FixedLength="false" />
  <Property Name="ProductNumber" Type="String" Nullable="false" MaxLength="25" Unicode="true" FixedLength="false" />
  <Property Name="Color" Type="String" MaxLength="15" Unicode="true" FixedLength="false" />
  <Property Name="ListPrice" Type="Decimal" Nullable="false" Precision="19" Scale="4" />
  <Property Name="Size" Type="String" MaxLength="5" Unicode="true" FixedLength="false" />
  <Property Name="Weight" Type="Decimal" Precision="8" Scale="2" />
  <Property Name="Style" Type="String" MaxLength="2" Unicode="true" FixedLength="true" />
</EntityType>

AdventureWorks Sales Model サンプルのストレージ モデルの Product 型は、この例では変更されていません。

参照

概念

Entity Data Model のマッピング シナリオ (アプリケーション シナリオ)
EntitySetMapping 要素 (MSL)