Элемент QueryView (язык MSL)

Элемент QueryView в языке MSL задает сопоставление только для чтения между типом сущности или связью в концептуальной модели и таблицей в основной базе данных. Такое сопоставление определяется с помощью запроса Entity SQL , выполняемого применительно к модели хранения, а результирующий набор выражается в терминах сущности или взаимосвязи концептуальной модели. Представления запросов доступны только для чтения, поэтому для обновления типов, которые определены представлениями запросов, не могут применяться стандартные команды обновления. Обновления этих типов можно осуществлять с помощью функций изменения. Дополнительные сведения см. в разделе How to: Map Modification Functions to Stored Procedures.

Cc716798.note(ru-ru,VS.100).gifПримечание
В элементе QueryView выражения Entity SQL, содержащие GroupBy, групповые агрегаты и свойства навигации, не поддерживаются.

Элемент QueryView может быть дочерним элементом элемента EntitySetMapping или элемента AssociationSetMapping. В первом случае представление запроса определяет сопоставление только для чтения для сущности в концептуальной модели. Во втором случае представление запроса определяет сопоставление только для чтения для связи в концептуальной модели.

Cc716798.note(ru-ru,VS.100).gifПримечание
Если элемент AssociationSetMapping предназначен для связи со ссылочным ограничением, то элемент AssociationSetMapping не используется.Дополнительные сведения см. в разделе Элемент ReferentialConstraint (CSDL).

Элемент QueryView не может иметь дочерние элементы.

Применимые атрибуты

В следующей таблице описываются атрибуты, которые можно применить к элементу QueryView.

Имя атрибута Необходимо Значение

TypeName

Нет

Имя типа концептуальной модели, сопоставляемой представлением запроса.

Пример

В следующем примере элемент QueryView задается в качестве дочернего элемента для элемента EntitySetMapping, а также задается представление запроса для типа сущности Department в модели School Model.

<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 в модели хранения, тип Department в модели School был изменен на базе этих сопоставлений следующим образом.

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

Пример

В следующем примере элемент QueryView задается в качестве дочернего элемента для элемента AssociationSetMapping, а также задается сопоставление только для чтения для связи FK_Course_Department в модели School.

Cc716798.note(ru-ru,VS.100).gifПримечание
Если сопоставление набора ассоциаций задается представлением запроса, то сопоставления типов сущности на концах ассоциации должны также задаваться представлениями запросов.

<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 в концептуальной модели.

  • Определение условных фильтров для результатов запроса.

  • Наложение меньшего числа ограничений на данные в концептуальной модели, нежели в модели хранения. Так, можно определить свойство в концептуальной модели как допускающее значение NULL, даже если столбец, которому оно сопоставляется, не поддерживает значения null.

При определении представлений запросов для сущностей необходимо принимать во внимание следующие соображения.

  • Представления запросов доступны только для чтения. Обновление сущностей можно осуществлять только с помощью функций изменения.

  • В случае определения типа сущности через представление запроса необходимо также определять все связанные сущности через представления запросов.

  • При сопоставлении ассоциации «многие ко многим» с сущностью модели хранения, которая представляет таблицу связей, в реляционной схеме необходимо определять элемент QueryView в элементе AssociationSetMapping для данной таблицы связей.

  • Представления запросов должны быть определены для всех типов в иерархии типов. Это можно сделать следующими способами:

    • с помощью одного элемента QueryView, который определяет один запрос Entity SQL , возвращающий объединение всех типов сущностей данной иерархии;

    • с помощью одного элемента QueryView, который указывает один запрос Entity SQL , использующий оператор CASE для возвращения конкретного типа сущности в иерархии на основе заданного условия;

    • с помощью дополнительного элемента QueryView для конкретного типа в иерархии (в данном случае нужно использовать атрибут TypeName элемента QueryView, чтобы указать тип сущности для каждого представления);

  • когда представление запроса определено, указание атрибута StorageSetName элемента EntitySetMapping становится невозможным;

  • когда представление запроса определено, элемент EntitySetMapping не может также содержать сопоставления Property.

См. также

Основные понятия

Элемент EntitySetMapping (язык MSL)
Элемент AssociationSetMapping (язык MSL)

Другие ресурсы

Спецификации языка CSDL, SSDL и MSL
Моделирование и сопоставление (платформа Entity Framework)