zoukankan      html  css  js  c++  java
  • Entity Framework 学习总结之六:EntitySQL 介绍入门

    Entity SQL Language 简介

    什么是Entity SQL

    Entity SQL类似SQL语言,它的存在是为了查询ADO.NET Entity FrameworkEF),以用于支持Entity Data Model EDM EDM表示一组实体与关系(ER)的集合,映射到指定的数据源(可以是MsSql 或其它类型的数据库)。Entity SQL支持EDM,使用户能够有效地查询数据。

    Entity SQLT-SQL

    Entity SQL支持EDM的直接查询,包括它的继承及关系。它在语法上与T-SQL类似,但也有很多不同。

    支持与不支持的查询:

    1) from子句

    2) inexists

    3) union, intersect, except来表示并交差集

    4) join表达式

    5) 支持p.Address.City 这种级联查询

    6) 不支持*操作

    7) group by时也要select k from T as t group by (t.x + t.y) as k这种方式

    8) 无法使用T-SQL的函数

    它支持T-SQL的子查询和表达式,它可以用于任何支持它的数据库,这里给出一些合法的表达式:

    ·    1+2 *3

    ·    "abc"

    ·    row(1 as a, 2 as b)

    ·    { 1, 3, 5}

    ·    e1 union all e2

    ·    set(e1)

    对比的例子:

    T-SQLselect t.x + t.y from T as t group by t.x + t.y

    Entity SQLselect k from T as t group by (t.x + t.y) as k

    Entity Sql也支持这种方式:select Tab.a from Tab

    Entity SQL支持的数据类型:

    ·    第一类是原始数据类型,例如EMD.Int32

    ·    第二类是在模式(Schema)中定义的类型,例如实体类型、关系类型等;

    ·    第三类是临时出现的类型:像集合、行和引用,它们都是匿名类型。

    临时出现的类型

    首先,为什么管它们叫归结为临时出现的类型?大家知道,EF采用对象模型,而SQL等数据库是关系模型,它们之间要进行数据传递,必然有一个关系模型到对象模型的转换;另外,关系模型的相互数据交换,也可借用一下这些类型直接进行,而不必绕圈子。而这些类型的数据,一旦这个交互种过结束,也就意味着这个类型的对象将会消亡。故将这一些类型归结为一类。

    其次,这一类包含了哪些数据类型?

    1) 集合(Collection

    2) 行(Row

    3) 引用(Ref)

    集合:使用MULTISET()或者花括号——{}来创建,例如:MULTISET("Lenovo", "HP", "ASUS"),这等价于:{"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),将会返回一个由BrandType列构成的行对象。

    将行和集合稍作组合,便可以返回一个多行的集合: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 c from NorthwindEntities.Customers as c

    将返回所有的Customers的对象集合。

    那么,通过添加关键字REF

    select ref(c) from NorthwindEntities.Customers as c

    将返回一个引用集合:

    第二种,使用CREATEREF关键字。例如:

    CREATEREF(NorthwindEntities.Employees,ROW(1));

    其中使用ROW关键字,传入需要引用的行的主键的值。那么,我们有什么必要去使用引用?我们可以把引用看成是一种获取数据的轻型的解决方案,我们记录了在哪儿去获取值,但是并没有真正的数据获取出来,这样,不到必要时候,就没有必要在应用程序和数据库之间传递大量的数据。在上面那条语句中,我们并没有取出所有的值。而一旦必要,只要访问一下这个实体集的任意一个属性,或者使用DEREF表达式,即可获取数据。

    例如:CREATEREF(NorthwindEntities.Employees,ROW(2)).Address

    如果要获取整个行的,则使用DEREFDEREF(CREATEREF(NorthwindEntities.Employees,ROW(2)))

    其实,如果我们改一个形式:

    DEREF(CREATEREF(NorthwindEntities.Employees,ROW(@EmployeeID)))

    在实际应用中,我们经常要根据主键,来获取一个实体,这时,把传入的主键参数化,返回整个实体。这也可以算是一个典型应用了。

    注释

    Entity SQL 查询可以包含注释。注释行以两个短划线 (--) 开头。

    例如:"select ref(c) from NorthwindEntities.Customers as c -- this a comment "

    ESQL内部存在一些关键字:NULLBOOLEANINTEGERDECIMALFLOATDOUBLESTRINGDATETIMETIME DATETIMEOFFSETBINARYGUID

    这些类型几乎都是可以通用于各种数据库的。Entity SQL支持的字符集:UTF-16

  • 相关阅读:
    sizeof
    {面试题10: 二进制中1的个数}
    {面试题9: 斐波那契数列}
    gcc常用选项
    mount.nfs: access denied by server while mounting localhost:/home/xuwq/minilinux/system
    ubuntu bash提示找不到文件或目录
    linux 编译内核[scripts/kconfig/dochecklxdialog] 错误
    最简单的抓包程序
    linux命令行解析函数介绍
    逻辑地址到线性地址的转换
  • 原文地址:https://www.cnblogs.com/astar/p/EntitySQL.html
Copyright © 2011-2022 走看看