代码改变世界

ADO.NET Entity FrameWork学习笔记之类型(转载)

2010-02-28 14:50  爱研究源码的javaer  阅读(269)  评论(0编辑  收藏  举报

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