现在的位置: 首页 > 综合 > 正文

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

2012年08月22日 ⁄ 综合 ⁄ 共 4264字 ⁄ 字号 评论关闭

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 ROWSELECT VALUE两类。如果直接写SELECTEntity 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。如果您只是希望以非确定的方式限制结果中的行数,则应使用 TOPTOP 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

【上篇】
【下篇】

抱歉!评论已关闭.