Partager via


Élément QueryView (MSL)

L'élément QueryView en langage MSL (Mapping Specification Language) définit un mappage en lecture seule entre un type d'entité ou une association dans le modèle conceptuel et une table dans la base de données sous-jacente.Vous définissez ce mappage avec une requête Entity SQL évaluée par rapport au modèle de stockage et vous exprimez le jeu de résultats en termes d'entité ou d'association dans le modèle conceptuel.Les affichages des requêtes étant en lecture seule, les types qu'ils définissent ne peuvent pas être mis à jour au moyen des commandes de mise à jour standard.Les mises à jour de ces types peuvent être effectuées au moyen de fonctions de modification.Pour plus d'informations, consultez Procédure : mapper des fonctions de modification à des procédures stockées.

Notes

Dans l'élément QueryView, les expressions Entity SQL qui contiennent GroupBy, des agrégats de groupe ou des propriétés de navigation, ne sont pas prises en charge.

L'élément QueryView peut être un enfant de l'élément EntitySetMapping ou de l'élément AssociationSetMapping.Dans le cas précédent, l'affichage des requêtes définit un mappage en lecture seule pour une entité dans le modèle conceptuel.Dans le cas précédent, l'affichage des requêtes définit un mappage en lecture seule pour une association dans le modèle conceptuel.

Notes

Si l'élément AssociationSetMapping est pour une association avec une contrainte référentielle, l'élément AssociationSetMapping est ignoré.Pour plus d'informations, consultez Élément ReferentialConstraint (CSDL).

L'élément QueryView ne peut pas avoir d'éléments enfants.

Attributs applicables

Le tableau ci-dessous décrit les attributs qui peuvent s'appliquer à l'élément QueryView.

Nom d'attribut

Requis

Valeur

TypeName

Non

Nom du type de modèle conceptuel mappé par l'affichage des requêtes.

Exemple

L'exemple suivant affiche l'élément QueryView en tant qu'enfant de l'élément EntitySetMapping et définit un mappage d'affichage des requêtes pour le type d'entité Department dans le Modèle School.

<EntitySetMapping Name="Departments">
  <QueryView>
          SELECT VALUE SchoolModel.Department(d.DepartmentID, 
                                              d.Name, 
                                              d.Budget, 
                                              d.StartDate)
          FROM SchoolModelStoreContainer.Department AS d
          WHERE d.Budget &gt; 150000
        </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>

Étant donné que la requête retourne uniquement un sous-ensemble des membres du type Department du modèle de stockage, le type Department du modèle School a été modifié en fonction de ce mappage, comme suit :

<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>
<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>

Exemple

L'exemple suivant affiche l'élément QueryView en tant qu'enfant d'un élément AssociationSetMapping et définit un mappage en lecture seule pour l'association FK_Course_Department dans le modèle School.

Notes

Si un mappage d'ensemble d'associations est défini par un affichage des requêtes, les mappages des types d'entité aux terminaisons de l'association doivent également être définis par les affichages des requêtes.

<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 &gt; 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>
<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>

Commentaires

Vous pouvez définir des affichages des requêtes pour activer les scénarios suivants :

  • Définir une entité du modèle conceptuel qui n'inclut pas toutes les propriétés de l'entité dans le modèle de stockage.Cela inclut les propriétés qui n'ont pas de valeurs par défaut et qui ne prennent pas en charge les valeurs null.

  • Mapper des colonnes calculées du modèle de stockage aux propriétés de types d'entités du modèle conceptuel.

  • Définir un mappage dans lequel les conditions utilisées pour partitionner des entités du modèle conceptuel ne sont pas basées sur l'égalité.Lorsque vous spécifiez un mappage conditionnel à l'aide de l'élément Condition, la condition fournie doit être égale à la valeur spécifiée.Pour plus d'informations, voir Élément Condition (MSL).

  • Mapper la même colonne du modèle de stockage à plusieurs types du modèle conceptuel.

  • Mapper plusieurs types à la même table.

  • Définir des associations dans le modèle conceptuel qui ne sont pas basées sur des clés étrangères du schéma relationnel.

  • Utiliser une logique métier personnalisée pour définir la valeur de propriétés du modèle conceptuel.Par exemple, vous pouvez mapper la valeur de chaîne « T » de la source de données à la valeur true, valeur booléenne du modèle conceptuel.

  • Définir des filtres conditionnels pour les résultats de la requête.

  • Appliquer moins de restrictions sur les données dans le modèle conceptuel que dans le modèle de stockage.Par exemple, vous pouvez rendre une propriété du modèle conceptuel nullable même si la colonne à laquelle elle est mappée ne prend pas en charge les valeurs null.

Vous devez tenir compte des points suivants lorsque vous définissez des affichages des requêtes pour les entités :

  • Les affichages des requêtes sont en lecture seule.Les mises à jour des entités ne peuvent être effectuées qu'au moyen de fonctions de modification.

  • Lorsque vous définissez un type d'entité par un affichage des requêtes, vous devez également définir toutes les entités associées par les affichages des requêtes.

  • Lorsque vous mappez une association plusieurs-à-plusieurs à une entité du modèle de stockage qui représente une table de liens dans le schéma relationnel, vous devez définir un élément QueryView dans l'élément AssociationSetMapping pour cette table de liens.

  • Les affichages des requêtes doivent être définis pour tous les types d'une hiérarchie des types.Pour ce faire, vous pouvez procéder de différentes façons :

    • Avec un seul élément QueryView spécifiant une seule requête Entity SQL que retourne une union de tous les types d'entités dans la hiérarchie.

    • Avec un seul élément QueryView spécifiant une seule requête Entity SQL qui utilise l'opérateur CASE pour retourner un type d'entité spécifique dans la hiérarchie en fonction d'une condition spécifique.

    • Avec un élément QueryView supplémentaire pour un type spécifique de la hiérarchie.Dans ce cas, utilisez l'attribut TypeName de l'élément QueryView pour spécifier le type d'entité de chaque affichage.

  • Lors de la définition d'un affichage des requêtes, vous ne pouvez pas spécifier l'attribut StorageSetName sur l'élément EntitySetMapping.

  • Lors de la définition d'un affichage des requêtes, l'élément EntitySetMapping ne peut pas aussi contenir de mappages Property.

Voir aussi

Concepts

Élément EntitySetMapping (MSL)

Élément AssociationSetMapping (MSL)

Autres ressources

Spécifications CSDL, SSDL et MSL

Modélisation et mappage