QueryView 項目 (MSL)
對應規格語言 (MSL) 中的 QueryView 項目會定義概念模型中之實體類型或關聯與基礎資料庫中之資料表間的唯讀對應。該對應是使用針對儲存體模型評估的 Entity SQL 查詢來定義,而且您可藉由概念模型中的實體或關聯來表示結果集。因為查詢檢視是唯讀的,所以您無法使用標準更新命令來更新查詢檢視所定義的類型。您可以使用修改函式來更新這些類型。如需詳細資訊,請參閱 How to: Map Modification Functions to Stored Procedures。
注意
在 QueryView 項目中,不支援內含 GroupBy、群組彙總或導覽屬性的 Entity SQL 運算式。
QueryView 項目可以是 EntitySetMapping 項目或 AssociationSetMapping 項目的子項目。若是前者,查詢檢視會定義概念模型中之實體的唯讀對應。若是後者,查詢檢視會定義概念模型中之關聯的唯讀對應。
注意
如果 AssociationSetMapping 項目適用於具有參考條件約束的關聯,則會忽略 AssociationSetMapping 項目。如需詳細資訊,請參閱 ReferentialConstraint 項目 (CSDL)。
QueryView 項目不能有任何子項目。
適用屬性
下表描述可套用至 QueryView 項目的屬性。
屬性名稱 |
必要 |
值 |
---|---|---|
TypeName |
否 |
要由查詢檢視對應的概念模型類型名稱。 |
範例
下列範例顯示的 QueryView 項目做為 EntitySetMapping 項目的子項目,它會定義 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>
<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>
<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 項目的子項目,它會定義 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>
<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 項目,會指定單一 Entity SQL 查詢根據特定條件使用 CASE 運算子傳回階層架構中的特定實體類型。
利用階層架構中特定類型的其他 QueryView 項目。在這個案例中,請使用 QueryView 項目的 TypeName 屬性來指定每個檢視的實體類型。
定義查詢檢視時,無法對 EntitySetMapping 項目指定 StorageSetName 屬性。
定義查詢檢視時,EntitySetMapping 項目也不能同時包含 Property 對應。
請參閱
概念
AssociationSetMapping 項目 (MSL)