`

Entity Framework 学习总结之七:EntitySQL 基本查询

 
阅读更多

Entity SQL 基本查询

SWFGHO 是什么? SELECT-FROM-WHERE-GROUP BY-HAVING-ORDER BY 的首字母缩写,也是 SQL 查询语句的最基本构成方法。 Entity SQL 是一种 " 仿 SQL" 的语言,因此,它在基本遵守 SFWGHO 的基础上,稍微加以扩展,形成了一套较 SQL 来得强大的查询语句。

 

表达式

Entity SQL 提供了一种最简单的查询方法 —— 表达式。一个表达式即一个查询语句。

 

举例说明,以下表达式均可以看作是 Entity SQL 的查询语句 ( 每行一个 )

1

1*2%3

MAX({1,3,4})

CASE WHEN MIN(MULTISET(-3,1,9))<0 THEN -100 ELSE 100 END

SUBSTRING('Hello',2,3)

 

正常的 Entity SQL 写法,例如:

select e from NorthwindEntities . Employees as e

select e .Address, e .City from NorthwindEntities . Employees as e order by e .City

 

结果:

 

注意:

·    不支持 SELECT * 操作,必须要 SELECT 列或者实体的别名。

·    建议显式的使用 AS 关键字。虽然在有些情况下, Entity SQL 可以 自动推断别名 ,但有时候,就会出错。因此,显式使用 AS 来声明别名有助于减少错误。

·    不区分大小写。

·    ESQL 后面的分号可以省略。

 

操作符

Entity SQL 支持如下操作符:

优先级     作用与类型      符号

1     层级               .,()[]

2               ! not

3     乘除               * / %

4     加减               +-

5     比较               < > <= >=

6     相等               = != <>

7               and &&

8               or ||

 

标识符

Entity SQL 提供两种标识符:简单标识符和带引号的标识符。

简单标识符: Entity SQL 中的简单标识符是字母数字和下划线字符的序列。标识符的第一个字符必须是字母字符( a-z A-Z )。

带引号的标识符:带引号的标识符是括在方括号 ([]) 中的任何字符序列。带中文的部分,请使用方括号包括起来,否则会报如下异常信息: 简单标识符 中文 只能包含基本拉丁字符。若要使用 UNICODE 字符,请使用转义标识符

 

正确的代码如下: Select c . CustomerID as [ 中文字符 ] from NorthwindEntities . Customers as c order by c . CustomerID skip 0 limit 10

 

SELECT ROW SELECT VALUE

Entity SQL 中, SELECT 又可细分为 SELECT ROW SELECT VALUE 两类。如果直接写 SELECT Entity SQL 将永远返回行对象集合 —— 即使指定了只返回某一列属性。因此,如果这样写,我们会用类似以下的代码来访问数据:

using (var edm = new NorthwindEntities ())

{

    string sqlStr = "select e.Address,e.City from NorthwindEntities.Employees as e order by e.City" ;

    ObjectQuery <DbDataRecord > query = edm.CreateQuery<DbDataRecord >(sqlStr);

    foreach (DbDataRecord rec in query.Execute(MergeOption .NoTracking))

    {

        Console .WriteLine(rec["Address"] );

    }

    Console .WriteLine(query.ToTraceString());

}

 

Entity SQL 提供了 SELECT VALUE 子句以跳过隐式行构造。 SELECT VALUE 子句中只能指定一项。在使用这样的子句时,将不会对 SELECT 子句中的项构造行包装器,并且可生成所要形状的集合。如果使用 SELECT VALUE ,就可以直接返回这个值,而不使用行来进行返回。例如:

using (var edm = new NorthwindEntities ())

{

    //VALUE 后面只能写一个。

    string sqlStr = "select VALUE e.Address from NorthwindEntities.Employees as e order by e.City" ;     

 

    ObjectQuery <string > query = edm.CreateQuery<string >(sqlStr);

    foreach (string result in query.Execute(MergeOption .NoTracking))

    {

        Console .WriteLine(result );

    }

    Console .WriteLine(query.ToTraceString());

}

 

直接查询实体:

using (var edm = new NorthwindEntities ())

{

    string sqlStr = "select VALUE e from NorthwindEntities.Employees as e order by e.City" ;

 

    ObjectQuery <Employees > query = edm.CreateQuery<Employees >(sqlStr);

    foreach (Employees eTemp in query.Execute(MergeOption .NoTracking))

    {

        Console .WriteLine(eTemp.Address );

    }

    Console .WriteLine(query.ToTraceString());

}

 

WHERE

代码片断:可以使用 and or 增加多条件判断。

string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City = 'London' " ;

ObjectQuery <Employees > query = edm.CreateQuery<Employees >(sqlStr);

foreach (Employees eTemp in query.Execute(MergeOption .NoTracking))

{

    Console .WriteLine(eTemp.City);

}

 

Top

SELECT 子句可以在可选的 ALL/DISTINCT 修饰符之后具有可选的 TOP 子子句。 TOP 子子句指定查询结果中将只返回第一组行。

...

string sqlStr = "select VALUE top (1) e from NorthwindEntities.Employees as e where e.City = 'London'" ;

另使用: Select top( 10 ) c . CustomerID from NorthwindEntities . Customers as c order by c . CustomerID

...

 

IN

...

string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City in {'London','testCity'}" ;

...

 

LIKE

...

string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City like '%nd%'" ;

...

 

Between And

string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.EmployeeID between 1 and 100" ;

 

参数

代码片断:

string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.City = @city " ;

 

ObjectParameter[] ps = { new ObjectParameter("city", "London") };

ObjectQuery <Employees > query = edm.CreateQuery<Employees >(sqlStr, ps );  

foreach (Employees eTemp in query.Execute(MergeOption .NoTracking))

{

    Console .WriteLine(eTemp.City);

}

 

Console .WriteLine(query.ToTraceString());

 

Order By (asc/desc)

...

string sqlStr = "select VALUE e from NorthwindEntities.Employees as e where e.EmployeeID between 1 and 100 order by e.EmployeeID desc" ;

...

 

SKIP/LIMIT 分页

可以通过在 ORDER BY 子句中使用 SKIP LIMIT 子句执行物理分页。若要以确定的方式执行物理分页,应使用 SKIP LIMIT 。如果您只是希望以非确定的方式限制结果中的行数,则应使用 TOP TOP SKIP/LIMIT 是互斥的。

 

CustomerID 排序,从第 2 条开始取 10 条记录:

Select value c from NorthwindEntities . Customers as c order by c . CustomerID skip 2 limit 10

 

Key

提取引用或实体表达式的键。如下 esql 语句,直接返回 Customer 表的主键:

SELECT value key( c ) FROM NorthwindEntities . Customers as c order by c . CustomerID LIMIT 10

 

CASE

TSQL 中的用法一样:

select case when c . CustomerID == 'BOLID' then true else false end from NorthwindEntities . Customers as c order by c . CustomerID limit 10

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics