QueryView 元素 (EntitySetMapping)
在 实体数据模型 (EDM) 中,EntitySetMapping 中的 QueryView 元素定义概念模型中的实体与存储模型中的实体之间的只读映射。使用根据存储模型计算的 Entity SQL 查询定义此查询视图映射,并以概念模型中的实体表达结果集。因为查询视图是只读的,所以不能使用标准更新命令来更新查询视图所定义的类型。可以使用修改函数来更新这些类型。有关更多信息,请参见如何:将修改函数映射到存储过程。
可以定义查询视图来实现以下方案:
在概念模型中定义一个实体,该实体不包含存储模型中的实体的所有属性。此实体包含的属性没有默认值且不支持 null 值。
将存储模型中计算的列映射到概念模型中实体类型的属性。
定义一个映射,其中用于对概念模型中的实体进行分区的条件不基于相等性。在使用 Condition 元素指定条件映射时,所提供的条件必须等于指定的值。有关更多信息,请参见 Condition 元素 (MappingFragment)。
将存储模型中的同一列映射到概念模型中的多个类型。
将多个类型映射到同一个表。
在概念模型中定义不基于关系架构中的外键的关联。
使用自定义业务逻辑设置概念模型中的属性值。例如,可以将数据源中的字符串值“T”映射到概念模型中的布尔值 true。
为查询结果定义条件筛选器。
强制对概念模型中的数据施加比存储模型中更少的限制。例如,可以使概念模型中的某个属性可为 null,即使该属性映射到的列不支持 null 值也如此。
为实体定义查询视图时需要考虑以下注意事项:
查询视图是只读的。只能使用修改函数来更新实体。
通过查询视图定义实体类型时,必须也通过查询视图来定义所有相关实体。
当多对多关联在存储模型中所映射到的实体表示关系架构中的链接表时,必须为此链接表在 AssociationSetMapping 元素中定义一个 QueryView 元素。有关更多信息,请参见 QueryView 元素 (AssociationSetMapping)。
必须为类型层次结构中的所有类型定义查询视图。可以采用以下方式实现此目的:
通过一个 QueryView 元素,该元素指定一个返回层次结构中所有实体类型的联合的 Entity SQL 查询。
通过一个 QueryView 元素,该元素指定一个使用 CASE 运算符基于特定条件返回层次结构中特定实体类型的 Entity SQL 查询。
通过一个用于层次结构中某个特定类型的附加 QueryView 元素。在这种情况下,可使用 QueryView 元素的 TypeName 属性为每个视图指定实体类型。
定义查询视图时,不能在 EntitySetMapping 元素上指定 StorageSetName 属性。
定义查询视图时,EntitySetMapping 元素不能同时包含 Property 映射。
下面的示例为 AdventureWorks 销售模型中的 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 销售模型中的 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 销售模型示例的存储模型中的 Product 类型没有更改。