EDM(实体数据模型)中定义了许多的类型。我们可以把它大致分为三类:第一类是原始数据类型,例如EMD.Int32。第二类是在模式(Schema)中定义的类型,例如实体类型、关系类型等;第三类是临时出现的类型:像集合、行和引用,它们都是匿名类型。
第一类第二类类型,大家已经接触颇多。我们来看一下什么是临时出现的类型。
首先,为什么管它们叫归结为临时出现的类型?大家知道,EF采用对象模型,而SQL等数据库是关系模型,它们之间要进行数据传递,必然有一个关系模型到对象模型的转换;另外,关系模型的相互数据交换,也可借用一下这些类型直接进行,而不必绕圈子。而这些类型的数据,一旦这个交互种过结束,也就意味着这个类型的对象将会消亡。故将这一些类型归结为一类。
其次,这一类包含了哪些数据类型?
1. 集合(Collection)
2. 行(Row)
3. 引用(Ref)
那么,如何使用这些类型?它们分别有哪些应用场景?
让我们由集合开始,看看它们的语法及典型场景。
集合:
集合使用MULTISET()或者花括号——{}来创建,例如:
MULTISET("Lenovo", "HP", "ASUS")
这等价于:{"Lenovo", "HP", "ASUS"}
这里给大家提个醒:MULTISET后面跟的是小括号,可别把它写成:MULTISET{Lenovo, HP, ASUS}——偷偷的告诉大家,偶一开始就是这么写的 -.-||
典型的,我们可以用集合返回一系列的值。例如:
SELECT BRAND FROM MULTISET("Lenovo", "HP", "ASUS") AS BRAND |
这将返回三个String类型的行,每行一个品牌名称。
MAX(MULTISET("Lenovo", "HP", "ASUS")) |
将会根据字母进行排序后,返回值最大的字符串——Lenovo。
行:
行的概念比较简单,它使用关键字ROW构建,形成一个行对象。例如:
ROW("Lenovo" as Brand, "T61" as Type) |
将会返回一个由Brand和Type列构成的行对象。
将行和集合稍作组合,便可以返回一个多行的集合:
MULTISET(ROW("Lenovo" as Brand, "T61" as Type),ROW("HP" as Brand, "V3911TU" as Type)) |
返回结果如下:
这里,列名称取的是第一个行对象的别名,下面这个语句,跟上面这一语句是等效的:
MULTISET(ROW("Lenovo" as Brand, "T61" as Type),ROW("HP" as aaa, "V3911TU" as bbb)) |
引用:
引用相当于数据库中的指针。有两种方式来创建引用。
第一种,使用REF关键字。我们假设:
SELECT VALUE nb FROM NbWhEntities.Notebook AS nb |
将返回所有的笔记本的对象集合:
那么,通过添加关键字REF:
SELECT REF(nb) FROM NbWhEntities.Notebook AS nb |
我们将返回一个引用集合:
第二种,使用CREATEREF关键字。例如:
CREATEREF(NbWhEntities.Notebook,ROW(1)) |
其中,使用我们使用ROW关键字,传入需要引用的行的主键的值。
那么,我们有什么必要去使用引用?我们可以把引用看成是一种获取数据的轻型的解决方案,我们记录了在哪儿去获取值,但是并没有真正的数据获取出来,这样,不到必要时候,就没有必要在应用程序和数据库之间传递大量的数据。在上面那条语句中,我们并没有取出所有的值。
而一旦必要,只要访问一下这个实体集的任意一个属性,或者使用DEREF表达式,即可获取数据。
例如,下面的语句将返回Lenovo ThinkPad,因为它的主键是1,并且我们调用了品牌属性,它不再是简单的引用 ,而是的的确确传输了数据。
CREATEREF(NbWhEntities.Notebook,ROW(1)).Brand |
如果要获取整个行的,则可以使用DEREF:
DEREF(CREATEREF(NbWhEntities.Notebook,ROW(1))) |
那么,得到的结果是:
这个语句看上去很滑稽,但你的确可以这么用。
其实,如果我们改一个形式,这个语句就不这么滑稽了:
DEREF(CREATEREF(NbWhEntities.Notebook,ROW(@NotebookId))) |
在实际应用中,我们经常要根据主键,来获取一个实体,这时,把传入的主键参数化,返回整个实体。这也可以算是一个典型应用了。
转自:http://www.cnblogs.com/xiaomi7732/archive/2008/10/05/1304084.html