Condividi tramite


Elemento QueryView (MSL)

L'elemento QueryView in Mapping Specification Language (MSL) definisce un mapping di sola lettura tra un tipo di entità o un'associazione nel modello concettuale e una tabella nel database sottostante.Il mapping viene definito con una query Entity SQL valutata rispetto al modello di archiviazione e il set di risultati viene espresso in termini di entità o associazione nel modello concettuale.Poiché le visualizzazioni di query sono di sola lettura, non è possibile utilizzare comandi di aggiornamento standard per aggiornare i tipi definiti da tali visualizzazioni.A tale scopo è possibile utilizzare le funzioni di modifica.Per ulteriori informazioni, vedere Procedura: eseguire il mapping delle funzioni di modifica alle stored procedure.

Nota

Nell'elemento QueryView, le espressioni Entity SQL che contengono GroupBy, aggregazioni di gruppo o proprietà di navigazione non sono supportate.

L'elemento QueryView può essere un figlio dell'elemento EntitySetMapping o AssociationSetMapping.Nel primo caso, la visualizzazione di query definisce un mapping di sola lettura per un'entità nel modello concettuale.Nel secondo caso, la visualizzazione di query definisce un mapping di sola lettura per un'associazione nel modello concettuale.

Nota

Se l'elemento AssociationSetMapping riguarda un'associazione con un vincolo referenziale, l'elemento AssociationSetMapping viene ignorato.Per ulteriori informazioni, vedere Elemento ReferentialConstraint (CSDL).

L'elemento QueryView non può contenere elementi figlio.

Attributi applicabili

Nella tabella riportata di seguito vengono descritti gli attributi che è possibile applicare all'elemento QueryView.

Nome attributo

È obbligatorio

Valore

TypeName

No

Nome del tipo di modello concettuale mappato dalla visualizzazione di query.

Esempio

Nell'esempio seguente viene illustrato l'elemento QueryView come un figlio dell'elemento EntitySetMapping e viene definito un mapping di visualizzazione di query per il tipo di entità Department nel modello 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>

Poiché la query restituisce solo un sottoinsieme dei membri del tipo Department nel modello di archiviazione, il tipo Department nel modello School è stato modificato in base al mapping seguente.

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

Esempio

Nell'esempio seguente viene illustrato l'elemento QueryView come un figlio dell'elemento AssociationSetMapping e viene definito un mapping di sola lettura per l'associazione FK_Course_Department nel modello School.

Nota

Se si definisce il mapping di set di associazioni tramite una visualizzazione di query, è necessario definire anche i mapping per i tipi di entità finali dell'associazione tramite visualizzazioni di query.

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

Commenti

È possibile definire le visualizzazioni di query per consentire gli scenari seguenti:

  • Definire un'entità nel modello concettuale che non includa tutte le proprietà dell'entità nel modello di archiviazione.Tra queste figurano le proprietà che non presentano valori predefiniti e non supportano valori null.

  • Eseguire il mapping delle colonne calcolate nel modello di archiviazione alle proprietà dei tipi di entità nel modello concettuale.

  • Definire un mapping in cui le condizioni utilizzate per partizionare le entità nel modello concettuale non siano basate sull'uguaglianza.Quando si specifica un mapping condizionale utilizzando l'elemento Condition, la condizione fornita deve essere uguale al valore specificato.Per ulteriori informazioni, vedere Elemento Condition (MSL).

  • Eseguire il mapping della stessa colonna nel modello di archiviazione a più tipi nel modello concettuale.

  • Eseguire il mapping di più tipi alla stessa tabella.

  • Definire associazioni nel modello concettuale che non siano basate sulle chiavi esterne dello schema relazionale.

  • Utilizzare la logica di business personalizzata per impostare il valore delle proprietà nel modello concettuale.È ad esempio possibile eseguire il mapping del valore di stringa "T" nell'origine dati a un valore booleano, ovvero true, nel modello concettuale.

  • Definire filtri condizionali per i risultati della query.

  • Applicare ai dati del modello concettuale un numero di restrizioni minore di quelle applicate al modello di archiviazione.È ad esempio possibile impostare una proprietà in modo che ammetta valori Null nel modello concettuale se la colonna alla quale è mappata non supporta valori null.

Le considerazioni seguenti riguardano la definizione delle visualizzazioni di query per le entità:

  • Le visualizzazioni di query sono di sola lettura.È possibile applicare aggiornamenti alle entità solo utilizzando le funzioni di modifica.

  • Quando viene definito un tipo di entità da una visualizzazione di query, è necessario definire anche tutte le entità correlate dalle visualizzazioni di query.

  • Quando si esegue il mapping di un'associazione molti-a-molti a un'entità nel modello di archiviazione che rappresenta una tabella dei collegamenti nello schema relazionale, è necessario definire un elemento QueryView nell'elemento AssociationSetMapping per la tabella in questione.

  • È necessario definire le visualizzazioni di query per tutti i tipi di una gerarchia di tipi.È possibile eseguire questa operazione nei modi seguenti:

    • Con un singolo elemento QueryView che specifica una singola query Entity SQL che restituisce un'unione di tutti i tipi di entità della gerarchia.

    • Con un singolo elemento QueryView che specifica una singola query Entity SQL che utilizza l'operatore CASE per restituire un tipo di entità specifico nella gerarchia, in base a una condizione specifica.

    • Con un elemento QueryView aggiuntivo per un tipo specifico della gerarchia.In tal caso, utilizzare l'attributo TypeName dell'elemento QueryView per specificare il tipo di entità per ogni visualizzazione.

  • Quando si definisce una visualizzazione di query, non è possibile specificare l'attributo StorageSetName sull'elemento EntitySetMapping.

  • Quando si definisce una visualizzazione di query, l'elemento EntitySetMapping non può contenere anche mapping Property.

Vedere anche

Concetti

Elemento EntitySetMapping (MSL)

Elemento AssociationSetMapping (MSL)

Altre risorse

Specifiche CSDL, SSDL e MSL

Modellazione e mapping