QueryView 元素 (MSL)
以映射规范语言 (MSL) 表示的 QueryView 元素定义概念模型中的实体类型或关联与基础数据库中的表之间的只读映射。 可以使用针对存储模型进行计算的 Entity SQL 查询定义映射,并且通过概念模型中的实体或关联表示结果集。 因为查询视图是只读的,所以不能使用标准更新命令来更新查询视图所定义的类型。 可以使用修改函数来更新这些类型。 有关更多信息,请参见How to: Map Modification Functions to Stored Procedures。
注意: |
---|
在 QueryView 元素中,不支持包含 GroupBy、组聚合或导航属性的实体 SQL 表达式。 |
QueryView 元素可以是 EntitySetMapping 元素或 AssociationSetMapping 元素的子元素。 在前一种情况中,查询视图定义概念模型中实体的只读映射。 在后一种情况中,查询视图定义概念模型中关联的只读映射。
注意: |
---|
如果某个具有引用约束的关联存在一个 AssociationSetMapping 元素,则将忽略该 AssociationSetMapping 元素。有关更多信息,请参见ReferentialConstraint 元素 (CSDL)。 |
QueryView 元素不能具有任何子元素。
适用的特性
下表介绍可应用于 QueryView 元素的特性。
特性名称 | 是否必需 | 值 |
---|---|---|
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
关联定义一个只读映射。
注意: |
---|
如果查询视图定义了关联集映射,则查询视图还必须定义该关联两端处实体类型的映射。 |
<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 值也如此。
为实体定义查询视图时需要考虑以下注意事项:
查询视图是只读的。 只能使用修改函数来更新实体。
通过查询视图定义实体类型时,必须也通过查询视图来定义所有相关实体。
当多对多关联在存储模型中所映射到的实体表示关系架构中的链接表时,必须为此链接表在 AssociationSetMapping 元素中定义一个 QueryView 元素。
必须为类型层次结构中的所有类型定义查询视图。 可以采用以下方式实现此目的:
通过一个 QueryView 元素,该元素指定一个返回层次结构中所有实体类型的联合的 Entity SQL 查询。
通过一个 QueryView 元素,该元素指定一个使用 CASE 运算符基于特定条件返回层次结构中特定实体类型的 Entity SQL 查询。
通过一个用于层次结构中某个特定类型的附加 QueryView 元素。 在这种情况下,可使用 QueryView 元素的 TypeName 属性为每个视图指定实体类型。
定义查询视图时,不能在 EntitySetMapping 元素上指定 StorageSetName 属性。
定义查询视图时,EntitySetMapping 元素不能同时包含 Property 映射。
另请参见
概念
EntitySetMapping 元素 (MSL)
AssociationSetMapping 元素 (MSL)