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


    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

  • 相关阅读:
    第三课 本代码用于学习vue根组件数据的各种绑定
    第七课 键入事件,点击绑定事件,数据判断及删除事件
    第九课 代码封装localstorage
    第八课 没有封装localstorage
    第五课 vue的事件调用自定义方法
    第六课 点击事件调用自定义方法
    new多个文件编程和split单个文件多个窗口编程
    线性表特点和用法总结
    scanf在输入整型数据和字符型数据时的不同
    tasklet源码注释翻译
  • 原文地址:https://www.cnblogs.com/johnwonder/p/1675129.html
Copyright © 2020-2023  润新知